静态字段承担全局变量的一个例子

本文探讨了如何在C#中利用静态字段和属性为每个新创建的对象自动分配递增ID。通过在Student类中设置静态变量NextId,并在构造函数中更新Id,确保每个实例都有唯一的标识。同时,还介绍了静态属性的使用,限制了NextId的外部赋值,保证数据安全性。这种方法在需要为对象实例分配唯一标识的场景中非常实用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 目标:每新建一个实例都自动分配累加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++;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值