You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中如何为Person类的每个实例分配唯一递增ID?

解决C# Person类实例唯一递增ID问题

你的问题出在静态变量countPersons是类级别的共享变量——所有Person实例都会读取同一个静态值,创建3个实例后它的值固定为3,所以所有实例的ID都显示3。要让每个实例拥有唯一ID,需要给每个实例单独存储自己的ID值,静态变量仅用来做全局计数。

修改后的代码

Person类

class Person
{
    // 实例级ID,每个对象独有且只读
    public int Id { get; }
    public string Name { private get; set; }
    public int Age { private get; set; }
    // 静态计数变量,全局共享
    private static int _countPersons;

    public Person(string name, int age)
    {
        // 先递增全局计数,再赋值给当前实例的ID
        _countPersons++;
        Id = _countPersons;
        Name = name;
        Age = age;
    }

    public void GetNameAndAge()
    {
        Console.WriteLine($"Player name: {Name ?? "unknown"} | Player age: {Age}");
    }

    public void GetInfo()
    {
        // 读取当前实例的Id,而非共享的静态变量
        Console.WriteLine($"Player name: {Name ?? "unknown"} | Player age: {Age}\nId: {Id}");
    }
}

Program类

class Program
{
    public static void Main(string[] args)
    {
        var player1 = new Person("David", 31);
        var player2 = new Person("Brad", 23);
        var player3 = new Person("Michael", 26);

        player1.GetNameAndAge();
        player1.GetInfo();
        player2.GetInfo();
        player3.GetInfo();
    }
}

关键修改说明

  1. 新增实例属性Id:设置为只读属性(仅定义getter),确保ID一旦分配就无法被修改,从根源保证唯一性。
  2. 调整构造函数逻辑:递增静态计数后,将当前计数值赋值给实例的Id,让每个实例保存自己创建时的计数状态。
  3. 修改GetInfo输出:读取当前对象独有的Id值,不再依赖共享的静态变量。

进阶补充(多线程场景)

如果代码会在多线程环境下创建Person实例,直接使用_countPersons++可能出现线程安全问题(多个线程同时修改计数导致ID重复)。此时可以用Interlocked.Increment保证原子操作:

// 替换构造函数里的计数递增代码
Id = Interlocked.Increment(ref _countPersons);

使用前需要引用System.Threading命名空间。

内容的提问来源于stack exchange,提问作者David Gor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 01:54:11