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(); } }
关键修改说明
- 新增实例属性
Id:设置为只读属性(仅定义getter),确保ID一旦分配就无法被修改,从根源保证唯一性。 - 调整构造函数逻辑:递增静态计数后,将当前计数值赋值给实例的
Id,让每个实例保存自己创建时的计数状态。 - 修改
GetInfo输出:读取当前对象独有的Id值,不再依赖共享的静态变量。
进阶补充(多线程场景)
如果代码会在多线程环境下创建Person实例,直接使用_countPersons++可能出现线程安全问题(多个线程同时修改计数导致ID重复)。此时可以用Interlocked.Increment保证原子操作:
// 替换构造函数里的计数递增代码 Id = Interlocked.Increment(ref _countPersons);
使用前需要引用System.Threading命名空间。
内容的提问来源于stack exchange,提问作者David Gor
相关产品推荐
相关产品推荐

