目标:每新建一个实例都自动分配累加ID。
class Program
{
static void Main(string[] args)
{
Student.NextId = 10000;
Student stu1 = new Student("abc", "ded");
Student stu2 = new Student("ddd", "dcd");
Console.WriteLine("{0} {1} {2}", stu1.FirstName, stu1.LastName, stu1.Id);
Console.WriteLine("{0} {1} {2}", stu2.FirstName, stu2.LastName, stu2.Id);
}
}
public class Student
{
// static关键字定义能由多个实例共享的数据。
public static int NextId;
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Salary { get; set; }
public Student(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
Id = NextId;
NextId++;
}
}
静态字段从属于类而非实例。
类和对象都能关联数据。
将类想象成模具,将对象想象成根据该模具浇铸的零件,可以更好地理解这一点。
- 例如,一个模具拥有的数据可能包括:到目前为止已用模具浇铸的零件数、下个零件的序列号、当前注入模具的液态塑料的颜色以及模具每小时生产零件数量。
- 类似地,零件也拥有它自己的数据:序列号、颜色以及生产日期/时间。虽然零件颜色就是生产零件时在模具中注入的塑料的颜色,但它显然不包含模具中当前注入的塑料颜色数据,也不包含要生产的下个零件的序列号数据。
设计对象时,程序员要考虑字段和方法应声明为静态还是基于实例。一般应将不需要访问任何实例数据的方法声明为静态方法,将需要访问实例数据的方法(实例不作为参数传递)声明为实例方法。静态字段主要存储对应于类的数据,比如新实例的默认值或者已创建实例个数。而实例字段主要存储和对象关联的数据。
此外也可以用静态属性来实现:
public static int NextId {get; private set;} = 42;
因为private set所以只能在内部赋值,而不能在外部赋值。
class Program
{
static void Main(string[] args)
{
Student stu1 = new Student("abc", "ded");
Student stu2 = new Student("ddd", "dcd");
Console.WriteLine("{0} {1} {2}", stu1.FirstName, stu1.LastName, stu1.Id);
Console.WriteLine("{0} {1} {2}", stu2.FirstName, stu2.LastName, stu2.Id);
}
}
public class Student
{
public static int _NextId = 100000;
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Salary { get; set; }
public static int NextId
{
get
{
return _NextId;
}
// set被设置为private;
private set
{
_NextId = value;
}
}
public Student(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
Id = NextId;
NextId++;
}
}