Увеличение уникального идентификационного номера в конструкторе

Я работаю над объектом в С#, где мне нужно, чтобы каждый экземпляр объекта имел уникальный идентификатор. Моим решением было просто поместить переменную-член, которую я вызываю 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();
    }
}