Увеличение уникального идентификационного номера в конструкторе
Я работаю над объектом в С#, где мне нужно, чтобы каждый экземпляр объекта имел уникальный идентификатор. Моим решением было просто поместить переменную-член, которую я вызываю idCount в классе и внутри конструктора, который у меня был бы:
objectID = idCount;
idCount++;
Я думал, что это решит мою проблему, но кажется, что idCount никогда не увеличивается, даже если конструктор вызывается несколько раз. Например, если idCount = 1, objectID для всех объектов все равно 1. Почему idCount ++ не работает?
Любая помощь будет оценена по достоинству. Извиняюсь, если мое объяснение недостаточно, я не уверен, как еще объяснить это.
Ответы
Ответ 1
Вам нужно статическое свойство в вашем классе, но вам нужно назначить его переменной экземпляра внутри класса, если вы хотите, чтобы каждый объект содержал идентификатор, с которым он был создан.
Кроме того, вы захотите использовать 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);
}
}
Ответ 2
Вы можете использовать статическую переменную в своем классе, которая обновляется при инициализации объекта.
public class Foo
{
private static int ID = 0;
private int myId = 0;
public int MyId
{
get { return myId; }
}
public Foo()
{
ID++;
this.myId = ID;
}
}
Ответ 3
Вы устанавливаете IdCount как статический член MyObject.
public class MyObject
{
static int idCount = 0;
private int _objectID;
public int ObjectID
{
get { return _objectID; }
}
public MyObject()
{
idCount++;
_objectID = idCount;
}
}
Ответ 4
Как указывали все, статические переменные являются конкретным ответом на ваш вопрос. Но статические переменные имеют только область видимости процесса, в котором они были созданы, и между процессами нет отношения (например, среда с балансировкой нагрузки).
Если то, что вы ищете, является уникальным способом идентификации экземпляра объекта в течение всего срока его службы, я предлагаю что-то вроде:
byte[] bytes = new byte[8];
RNGCryptoServiceProvider crypto = new RNGCryptoServiceProvider();
crypto .GetBytes( bytes );
long id = BitConverter.ToInt64( bytes, 0 );
Это даст вам случайное число, которое имеет чрезвычайно низкую (примерно 0-1 из 100 000 000) вероятность столкновения, и вам не нужно беспокоиться о ее отслеживании.
Ответ 5
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();
}
}