增加构造函数中的唯一ID号

我正在使用C#中的一个对象,我需要该对象的每个实例都有一个唯一的id。 我对此的解决方案只是将一个成员变量放在类中,并在构造函数中调用idCount:

objectID = idCount; idCount++; 

我认为这可以解决我的问题,但似乎idCount永远不会增加,即使构造函数被多次调用。 例如,如果idCount = 1,则所有对象的objectID仍为1.为什么idCount ++不起作用?

任何帮助,将不胜感激。 抱歉,如果我的解释不充分,我不确定如何解释它。

您需要在类中使用静态属性,但是,如果希望每个对象都包含它创建的ID,则需要将其分配给类中的实例变量。

此外,如果要同时更新多个实例,则需要在计数器上使用Interlocked.Increment:

  public class Foo { private static int m_Counter = 0; public int Id { get; set; } public Foo() { this.Id = System.Threading.Interlocked.Increment(ref m_Counter); } } 

您可以在类中使用静态变量,该变量在初始化对象时得到更新。

 public class Foo { private static int ID = 0; private int myId = 0; public int MyId { get { return myId; } } public Foo() { ID++; this.myId = ID; } } 

您设置IdCount是MyObject的静态成员。

 public class MyObject { static int idCount = 0; private int _objectID; public int ObjectID { get { return _objectID; } } public MyObject() { idCount++; _objectID = idCount; } } 

正如大家所指出的,静态变量是您问题的具体答案。 但是静态变量只在创建它们的过程中具有范围,并且跨过程没有任何关系(例如,负载平衡的Web环境)。

如果您正在寻找的是一种在其生命周期内识别对象实例的独特方式,我建议如下:

 byte[] bytes = new byte[8]; RNGCryptoServiceProvider crypto = new RNGCryptoServiceProvider(); crypto .GetBytes( bytes ); long id = BitConverter.ToInt64( bytes, 0 ); 

这将为您提供一个随机数,它具有极低的(大约0-1-100,000)碰撞几率,您无需担心跟踪它。

 public sealed class SingletonIdGenerator { private static long _id; private SingletonIdGenerator() { } public string Id { get { return _id++.ToString().Substring(8); } } public static SingletonIdGenerator Instance { get { return Nested.instance; } } private class Nested { static Nested() { _id = DateTime.Now.Ticks; } internal static readonly SingletonIdGenerator instance = new SingletonIdGenerator(); } }