递增构造函数中的唯一ID号
本文关键字:唯一 ID 构造函数 | 更新日期: 2023-09-27 18:20:01
我正在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;
}
}
正如大家所指出的,静态变量是您问题的具体答案。但是静态变量只在创建它们的过程中具有作用域,并且在过程之间没有关系(例如,负载平衡的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();
}
}