C#:类的成员--字段

类中成员可以分为数据成员和函数成员;字段就属于前者--数据成员,字段就是用来存储数据的。

字段:表示与对象、类型相关的变量;

  • 字段常被叫做"成员变量";
  • 当字段与对象相关联的时候又被叫做"实例字段"
  • 当字段与类型关联的时候被叫做"静态字段"。

字段的声明:

  • 字段声明虽然带有分号,但是它并不是语句;
  • 字段属于类的成员,所以字段声明出现在类体中。(不能是方法体中)
  • 语法: 一组字段修饰符 类型 字段名 [= 值或表达式]
  • 能修饰字段的修饰符的组合是从下面的几个中挑选的:
    • new
    • public
    • internal
    • protected
    • private
    • static
    • readonly
    • volatile
  • 字段声明时不进行初始化,系统会将这些字段初始化成该类型的默认值。

实例字段

class Program
{
    static void Main(string[] args)
    {
        Student student1 = new Student();
        student1.name = "xiaoming";
        student1.age = 19;
        Console.WriteLine(student1.name + "  " + student1.age);

        Student student2 = new Student();
        student2.name = "mike";
        student2.age = 22;
        Console.WriteLine(student2.name + " " + student2.age);

        Console.ReadKey();
    }
}

class Student
{
    public string name;
    public int age;
}

运行结果:

xiaoming  19
mike 22

实例字段是与对象相关的,每个对象拥有的实例字段是独立的。从student1和student2中的两个实例字段输出结果可以看出。

静态字段:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine($"学生的数量是:{Student.amount}");
        Student student1 = new Student();
        student1.name = "xiaoming";
        student1.age = 19;
        Console.WriteLine(student1.name + "  " + student1.age);

        Student student2 = new Student();
        student2.name = "mike";
        student2.age = 22;
        Console.WriteLine(student2.name + " " + student2.age);

        Console.WriteLine($"学生的数量是:{Student.amount}");

        Console.ReadKey();
    }
}

class Student
{
    public string name;
    public int age;

    public static int amount;

    public Student()
    {
        amount++;
    }
}

运行结果:

学生的数量是:0
xiaoming  19
mike 22
学生的数量是:2

静态字段是类型相关的,即不需要创建实例,就可以访问到它。上面的例子通过Student类直接访问amount静态字段,说明了这一点。

技巧:字段声明是就初始化和在构造函数中初始化字段的效果是一样的。

实例字段可以在声明的时候初始化值;也可以在实例构造函数中进行初始化。

class Student
{
    public string name;
    public int age;

    public static int amount;

    public Student(int age, string name)
    {
        this.age = age;
        this.name = name;
    }

    public Student()
    {
        amount++;
    }
}
//或者
class Student
{
    public string name = "未知";
    public int age = 18;

    public static int amount;

    public Student()
    {
        amount++;
    }
}

静态字段可以在声明的时候初始化;也可以在静态构造函数中进行初始化。

静态构造函数中初始化静态字段

静态字段与实例字段:

  • 声明格式上 静态字段 需要static修饰
  • 存储上 静态字段只在第一次加载所在的类类型的时候初始化一次,不随实例的创建而增多 ;而实例字段是在实例创建的时候 才初始化,每创建一个实例就会在堆中多开辟一块儿内存来存放实例字段。

下图展示了静态字段和实例字段的初始化次序:

静态字段与实例字段何时被初始化

从上面的调试结果可以看出:静态字段只会初始化一次(在我们使用的这个类的那一刻);实例字段在每次new 类型 的时候都会被初始化

只读字段:当类型或者实例中的某些数据一旦初始化后,我们就不希望他们再被修改,那么我们就需要使用只读字段来实现。

  • 只读字段使用 readonly修饰
  • 由于字段分为 实例字段和静态字段 所以 只读字段也就被分为 实例只读字段和静态只读字段
  • 对于只读字段的初始化我们可以在字段声明的时候初始化;也可以在构造函数中进行初始化,但是在其它地方初始化是不被允许的。

实例只读字段:学生实例创建后,每个学生的ID数据,我们不希望在确定了之后再被修改,便可以使用 实例只读字段来实现。

实例只读字段的初始化

静态只读字段:当类型中的某些数据声明后,并不希望别人能够改变它,这时候便可以使用静态只读字段来实现。

class MyColor
{
    public int Red;
    public int Green;
    public int Blue;
}
//定义了各种颜色,这些颜色的数据我们只希望他们被拿去使用,而不希望被修改。
class SolidBrush
{
    public static readonly MyColor defaultColor;
    public static readonly MyColor redColor;
    static SolidBrush()
    {
        defaultColor = new MyColor() { Red = 255, Green = 255, Blue = 255 };
        redColor = new MyColor() { Red = 255, Green = 0, Blue = 0 };
    }
}
//在Mian函数中使用
Console.WriteLine(SolidBrush.defaultColor.Red);//不可在对default字段进行修改

以上便是对字段的总结 记录下来以便以后查阅

原文地址:https://www.cnblogs.com/bigbosscyb/p/13699501.html