with values new .net c#-3.0 object initialization

.net - values - new object[] c#



Propiedades del iniciador privado en la inicialización del objeto C#3.0 (4)

He tenido este requisito en el pasado también para cosas OR / M. Lo que básicamente hago es usar una propiedad real con campo de respaldo y verificar si la propiedad ya se ha configurado. Si es así, lanza una excepción.

public string myName { get{ return _myName; } set { if( _myName != null && _myName != value ) throw new Exception( "The myName property may only be set once." ); _myName = value; } } private string _myName;

Y otra opción para la compatibilidad OR / M que también aprovecha la inicialización del constructor:

public class MyClass { [Obsolete( "For ORM use only!" )] [EditorBrowsableState( EditorBrowsableState.Never )] public MyClass(){} public MyClass( string name ){ myName = name; } public string myName { get; private set; } public string myId { get; set; } }

Si tengo el siguiente código:

public class MyClass { public string myName { get; private set; } public string myId { get; set; } }

Se crea una variable privada generada por el compilador para el setter. Quiero que el setter no sea accesible solo para la inicialización de objetos. Pero, ¿cómo puedo establecer inicialmente la variable myName?

Leyendo acerca de la inicialización de objetos encontré lo siguiente:

... es de solo lectura y el campo privado que representa el almacenamiento subyacente tiene un nombre generado por el compilador que no podemos usar en un constructor para asignarlo. La solución es usar [...] inicializadores de objetos

La solución sería, entonces, usar:

MyClass mc = new MyClass { myName = "What ever", myId = "1234" };

Pero esto termina en un error de compilación que dice que:

La propiedad o indexador ''MyClass.MyClass.myName'' no se puede utilizar en este contexto porque el acceso del conjunto es inaccesible

Entonces, ¿hay alguna manera de lograr establecer este valor usando la inicialización de objetos? Si hay, ¿cuál es la forma correcta de hacerlo?


No, no hay forma de lograr esto. Los Iniciales de objetos solo le permiten acceder a campos y propiedades a los que de otra manera se podría acceder fuera del inicializador.

Su mejor opción es usar un constructor que establezca explícitamente estas propiedades.


Private set en myName significa que solo se puede inicializar (configurar) desde algo que sea miembro de MyClass . Por ejemplo:

public class MyClass { public string myName { get; private set; } public string myId { get; set; } public static MyClass GetSampleObject() { MyClass mc = new MyClass { myName = "Whatever", myId = "1234" }; return mc; } }

(Copié y pegué su código de inicialización en el método GetSampleObject ).

Pero si intentas configurarlo fuera de MyClass , obtienes un error de compilación, porque private es privado.


Si necesitan configurarse en la inicialización, considera pasarlos como args al constructor