C# 类具有哪些成员?
字段
1.什么是字段
- 字段(field)是一种表示与对象或类型(类与结构体)关联的变量
- 字段是类型的成员,旧称“成员变量”
- 与对象关联的字段亦称“实例字段”
- 与类型关联的字段称为“静态字段”,由static修饰
通过一个代码来详细了解实例字段与静态字段的功能。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace DateMemberExample
{internal class Program{static void Main(string[] args){List<Student>stuList= new List<Student>(); //创建一个新的空列表for (int i = 0; i < 100; i++)// 循环100次{Student stu = new Student();// 创建一个新的Student对象stu.Age = 24;stu.Score = i;stuList.Add(stu);// 将新创建的Student对象添加到stuList中}//计算总年龄和总分数,并根据学生总数计算平均年龄和平均分数。int totalAge = 0;int totalScore = 0;foreach (Student stu in stuList){totalAge += stu.Age;totalScore += stu.Score;}Student.AverageAge = totalAge/Student.Amount;Student.AverageScore = totalScore/Student.Amount;Student.ReportAmount();Student.ReportAverageAge ();Student.ReportAverageScore();Console.ReadLine();}}class Student{public int Age;public int Score;public static int AverageAge;public static int AverageScore;public static int Amount;public Student() //每次实例被创建时,Amount加1{Student.Amount++;}public static void ReportAmount(){Console.WriteLine(Student.Amount);}public static void ReportAverageAge(){Console.WriteLine(Student.AverageAge);}public static void ReportAverageScore(){Console.WriteLine(Student.AverageScore);}}
}
代码分析:
- 定义了两个实例字段:
Age
和Score
。- 定义了三个静态字段:
AverageAge
、AverageScore
和Amount
。- 定义了一个无参数构造函数,每次创建新的
Student
实例时,Amount
字段递增。- 定义了三个静态方法:
ReportAmount
、ReportAverageAge
和ReportAverageScore
,分别用于报告学生总数、平均年龄和平均分数。
2.字段的声明
- 尽管字段声明带有分号,但它不是语句
- 字段的名字一定是名词
最常用的声明字段的格式是:访问级别+数据类型+变量名 或者 访问级别+ static + 数据类型+变量名。如上面的代码中:
public int Age;//最好初始化
public static int AverageAge;
3.字段的初始值
- 无显式初始化时,字段获得其类型的默认值,所以字段“永远都不会未被初始化”
- 实例字段初始化的时机 -- 对象创建时
- 静态字段初始化的时机 -- 类型第一次被加载(load)时
在C#中,静态构造器主要用于初始化类的静态字段,并且在整个应用程序的生命周期中只执行一次。如上面的代码中;
static Student() //静态构造器:对静态字段初始化,且只执行一次
{
Student.Amount = 100;
}//与以下的代码得到的结果一样
public Student() //构造函数(实例构造器):每次实例被创建时,Amount加1
{
this.Age = 0;//忽略该代码,最好在声明字段时就赋予初始值
Student.Amount++;
}
注意:创建实例只读字段,只有在创建实例时有一次修改的机会
using System;class Student
{public readonly int ID; // 声明只读字段,不能修改// 构造函数public Student(int id){ID = id; // 在创建实例时,可以有一次机会设定ID}public void DisplayID(){Console.WriteLine("Student ID: " + ID);}
}class Program
{static void Main(){Student stu1 = new Student(1); // 在创建实例时这样写stu1.DisplayID(); // 则实例stu1的ID是1// 下面的代码会导致编译错误,因为ID是readonly的// stu1.ID = 2; // 错误!}
}