Estoy trabajando en un objeto en C# que me falta cada instancia del objeto tiene un identificador único. Mi solución a esto era simplemente para colocar una variable miembro que yo llamo idCount en la clase y en el constructor me gustaría tener:

objectID = idCount;
idCount++;

Yo pensé que esto se iba a solucionar mi problema, pero parece que idCount nunca se incrementa incluso a pesar de que el constructor se llama varias veces. Por ejemplo, si idCount = 1, el objectID para todos los objetos son todavía 1. ¿Por qué no idCount++ de trabajo?

Cualquier ayuda se agradece. Disculpas si mi explicación no es suficiente, no estoy seguro de qué otra manera explicar.

Quieres una variable estática para idCount.
Si usted no necesita estrictamente el incremento de número entero, un nuevo GUID puede hacer para un IDENTIFICADOR único. También necesitará una cuenta para el acceso de subprocesamiento-si procede-cuando el uso de la «estática».

OriginalEl autor ivarlee | 2012-01-11

5 Comentarios

  1. 26

    Necesita una propiedad estática en su clase, PERO, debe asignarlo a una variable de instancia dentro de la clase si desea que cada objeto contiene el id fue creado con.

    También, usted querrá usar Entrelazada.Incremento en el contador en caso de que la actualización de varias instancias al mismo tiempo:

        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);
            }
        }
    +1 – exactamente como lo he señalado en @Browman98 la respuesta.
    Creo que es más sencillo si utilizamos volatile en lugar de Interlocked.Increment?
    Puede ser más sencillo, pero no es seguro. Ver esta discusión para más información: stackoverflow.com/questions/154551/…
    Parece que no he entendido esta palabra clave para un par de años…¡oh, DIOS!
    Entrelazada.Incremento devuelve el valor incrementado de modo que no hay condición de carrera aquí, no hay nada que hacer es copiar el m_Counter campo directamente a instanceA.Id o instanceB.Id

    OriginalEl autor competent_tech

  2. 2

    Usted podría utilizar una variable estática en su clase que se actualiza cuando se inicializa el objeto.

    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: la clave es el incremento de valor que es estática, pero el identificador de instancia sigue siendo único. Sin embargo, este no es el hilo caja de seguridad – vea la sugerencia de @sablinkenlights respuesta acerca de enclavamiento si usted desea ser seguro para subprocesos.

    OriginalEl autor Brownman98

  3. 1

    Establece IdCount es miembro estático de MyObject.

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

    OriginalEl autor SeekASoftware

  4. 0

    Como todo el mundo ha señalado, las variables estáticas son la respuesta concreta a tu pregunta. Pero las variables estáticas sólo tiene alcance dentro del proceso en el que fueron creadas y no hay ninguna relación entre los procesos (por ejemplo, una carga equilibrada entorno web).

    Si lo que estás buscando es una forma única de identificar una instancia de objeto para la duración de su vida útil, que me sugieren algo así como:

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

    Esto le dará un número aleatorio que tiene una muy baja (aproximadamente el 0-1 en 100,000,000) de probabilidad de colisión y usted no necesita preocuparse de mantener un seguimiento de.

    OriginalEl autor Tim Medora

  5. 0
    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();
        }
    }

    OriginalEl autor Md Abu Zafar

Dejar respuesta

Please enter your comment!
Please enter your name here