Увеличение уникального идентификационного номера в конструкторе - PullRequest
10 голосов
/ 11 января 2012

Я работаю над объектом в C #, где мне нужно, чтобы каждый экземпляр объекта имел уникальный идентификатор. Мое решение этого состояло в том, чтобы просто поместить переменную-член, которую я называю idCount, в класс и внутри конструктора, который у меня будет:

objectID = idCount;
idCount++;

Я думал, что это решит мою проблему, но кажется, что idCount никогда не увеличивается, даже если конструктор вызывается несколько раз. Например, если idCount = 1, идентификатор объекта для всех объектов по-прежнему равен 1. Почему не работает idCount ++?

Любая помощь будет оценена. Извиняюсь, если мое объяснение не адекватно, я не уверен, как еще объяснить это.

Ответы [ 5 ]

26 голосов
/ 11 января 2012

Вам нужно статическое свойство в вашем классе, НО, вам нужно присвоить его переменной экземпляра в классе, если вы хотите, чтобы каждый объект содержал идентификатор, с которым он был создан.

Также вы можете использовать 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 голосов
/ 11 января 2012

Вы можете использовать статическую переменную в вашем классе, которая обновляется при инициализации объекта.

public class Foo
{
   private static int ID = 0;
   private int myId = 0;

   public int MyId
   {
      get { return myId; }
   }

   public Foo()
   {
       ID++;
       this.myId = ID;
   }
}
1 голос
/ 11 января 2012

Вы устанавливаете IdCount как статический член MyObject.

public class MyObject
    {
        static int idCount = 0;

        private int _objectID;
        public int ObjectID
        {
            get { return _objectID; }
        }


        public MyObject()
        {
            idCount++;
            _objectID = idCount;
        }
    }
0 голосов
/ 15 апреля 2017
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();
    }
}
0 голосов
/ 11 января 2012

Как уже отмечалось, статические переменные - это конкретный ответ на ваш вопрос. Но статические переменные имеют область действия только в том процессе, в котором они были созданы, и между процессами нет никакой связи (например, веб-среда с балансировкой нагрузки).

Если то, что вы ищете, является уникальным способом идентификации экземпляра объекта по продолжительности его жизни, я предлагаю что-то вроде:

byte[] bytes = new byte[8];

RNGCryptoServiceProvider crypto = new RNGCryptoServiceProvider();            
crypto .GetBytes( bytes );

long id = BitConverter.ToInt64( bytes, 0 );

Это даст вам случайное число, которое имеет чрезвычайно низкий (примерно 0-1 на 100 000 000) шанс столкновения, и вам не нужно беспокоиться о его отслеживании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...