类中成员可以分为数据成员和函数成员;字段就属于前者--数据成员,字段就是用来存储数据的。
字段:表示与对象、类型相关的变量;
- 字段常被叫做"成员变量";
- 当字段与对象相关联的时候又被叫做"实例字段"
- 当字段与类型关联的时候被叫做"静态字段"。
字段的声明:
- 字段声明虽然带有分号,但是它并不是语句;
- 字段属于类的成员,所以字段声明出现在类体中。(不能是方法体中)
- 语法: 一组字段修饰符 类型 字段名 [= 值或表达式]
- 能修饰字段的修饰符的组合是从下面的几个中挑选的:
- 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字段进行修改
以上便是对字段的总结 记录下来以便以后查阅