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

本文关键字:唯一 ID 构造函数 | 更新日期: 2023-09-27 18:20:01

我正在C#中处理一个对象,在那里我需要该对象的每个实例都有一个唯一的id。我的解决方案只是在类中和构造函数中放置一个我称之为idCount的成员变量:

objectID = idCount;
idCount++;

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

如有任何帮助,我们将不胜感激。如果我的解释不充分,我很抱歉,我不知道该怎么解释。

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

您的类中需要一个静态属性,但是,如果您希望每个对象都包含创建时使用的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;
   }
}

正如大家所指出的,静态变量是您问题的具体答案。但是静态变量只在创建它们的过程中具有作用域,并且在过程之间没有关系(例如,负载平衡的web环境)。

如果你正在寻找一种独特的方法来识别一个对象实例的生命周期,我建议这样做:

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

这将给你一个随机数,它发生碰撞的几率极低(大约为100000000中的0-1),你不需要担心跟踪它。

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

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

        public MyObject()
        {
            idCount++;
            _objectID = idCount;
        }
    }
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();
    }
}