• 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字段进行修改
    

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

  • 相关阅读:
    mysql学习【第4篇】:数据库之数据类型
    mysql学习【第3篇】:数据库之增删改查操作
    mysql学习【第2篇】:基本操作和存储引擎
    mysql学习【第1篇】:数据库安装
    模块
    面向对象 之 反射 内置方法
    面向对象 的属性 类方法 静态方法
    python day
    day 18 面向对象的 继承
    python day
  • 原文地址:https://www.cnblogs.com/bigbosscyb/p/13699501.html
Copyright © 2020-2023  润新知