2010-11-01 11 views
14

Imagine que tiene un campo _temas en una clase. Puede inicializar en el punto de la declaración:¿Es posible inicializar una propiedad en el punto de la declaración

class C 
{ 
    IList<string> _items=new List<string>(); 
} 

Ahora quiero convertir este campo para una propiedad de auto generada, pero la inicialización ya no es válida:

class C 
{ 
    public IList<string> Items=new List<string>(); {get; set;} // Invalid 
} 

Por lo tanto, tengo que hacer :

class C 
{ 
    public IList<string> Items {get; set;} 

    public C 
    { 
    Items=new List<string>(); 
    } 
} 

Pero esto no es tan conveniente como inicializar los campos en el punto de declaración. ¿Hay una mejor manera de hacer esto, sin tener que (innecesariamente) respaldar esta propiedad con un campo privado (inicializado en el punto de declaración), por ejemplo?

Gracias

+2

posible duplicado de (http: // stackoverflow. com/questions/40730/how-do-you-give-ac-auto-property-a-default-value) –

Respuesta

19

No, propiedades automáticas no le permiten establecer un valor inicial.

Es molesto, pero tal es la vida. (Es muy molesto que no pueden ser de sólo lectura, también Pero eso es una queja para otro día..)

EDIT: Ambas propiedades de sólo lectura implementadas de forma automática y especificar un valor inicial está programado para estar en C# 6.

+0

Realmente lo es. Pero veamos por el lado bueno. TENEMOS auto-get set. Solo eso me hace feliz. – Proclyon

+1

Sí, hubiera querido * poder * escribir 'IList {get; conjunto privado; } = new List (); 'o algo similar. –

+0

@Fredrik, eso era exactamente lo que esperaba. Quizás esta sería una buena característica para pedir en C# 5? –

0

No, esta es la única forma.

0

Como no declara el campo cuando usa { get; set; }, no puede especificar el valor inicial.

Así que debe declarar el campo usted mismo o inicializarlo en el constructor.

0

Usar un campo de respaldo privado o establecer el valor en el constructor son las únicas maneras de dar valores iniciales a una propiedad.

0

No creo que, en la construcción, como demuestre, es la siguiente mejor forma para no tener que utilizar un respaldo privado, y luego usar constructor-encadenamiento para asegurarse de que la propiedad siempre se inicie:

public MyClass() { PropA = default_Value; } 
public MyClass(params object[] args) : this() { /* other code */ } 

Sería una buena característica; pero luego, las propiedades implementadas automáticamente están ahí para simplificar la implementación de propiedades en los tipos; y no veo cómo podría agregar, en el nivel de idioma, la característica de valor predeterminado a una propiedad automática sin que el código parezca un poco, bueno, extraño.

Pero entonces, es por eso que no soy un diseñador de idiomas.

0

Me temo que no es posible inicializar directamente una propiedad de automóvil cuando la declaras. Y estoy de acuerdo en que es una pena. No conozco una mejor manera que el constructor tampoco. Ver también Initializing C# auto-properties

3

en C# 6 se puede escribir algo como esto: [? ¿Cómo dar un C# auto-propiedad de un valor predeterminado]

class C 
{ 
    public IList<string> Items {get; set;} = new List<string>(); 
} 
+1

¡Finalmente esto se agregó a C#! Funcionó para mí, gracias. – lukiller

Cuestiones relacionadas