2010-11-01 11 views
14

Wyobraź sobie, że masz pole w klasie. Można go zainicjować w momencie zgłoszenia:Czy możliwe jest zainicjowanie właściwości w miejscu deklaracji?

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

Teraz chcę przekonwertować to pole, aby auto generowane nieruchomości, ale inicjalizacji jest nieprawidłowy:

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

Więc muszę zrobić :

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

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

Ale to nie jest tak wygodne, jak inicjowanie pól w miejscu deklaracji. Czy istnieje lepszy sposób, aby to zrobić, bez konieczności (niepotrzebnie) zwrotu tej właściwości z prywatnym (zainicjowanym w momencie deklaracji) polem, na przykład.

Dzięki

+2

możliwy duplikat (http: // stackoverflow. com/questions/40730/how-do-you-give-ac-auto-property-a-default-value) –

Odpowiedz

19

Nie, właściwości automatyczne nie pozwalają na ustawienie wartości początkowej.

To denerwujące, ale takie jest życie. (Jest to irytujące, że nie mogą one być tylko do odczytu, zbyt Ale to rant na inny dzień.).

EDIT: Obie readonly automatycznie wdrażane właściwości i określenie wartości początkowej są trafi się w C# 6.

+0

To naprawdę jest. Ale spójrzmy na to z dobrej strony. Mamy zestaw auto-get. To samo mnie uszczęśliwia. – Proclyon

+1

Tak, bym * umiłował * możliwość wpisania 'IList {get; prywatny zestaw; } = nowa lista (); 'lub coś podobnego. –

+0

@Fredrik, dokładnie to miałem nadzieję. Być może byłaby to dobra funkcja, o którą można prosić w C# 5? –

0

Nie, to jedyny sposób.

0

Ponieważ nie deklaruje się pola przy użyciu { get; set; }, nie można określić wartości początkowej.

Musisz więc zadeklarować pole samodzielnie lub zainicjować je w konstruktorze.

0

Używanie prywatnego pola podkładu lub ustawianie wartości w konstruktorze to jedyne sposoby na podanie początkowych wartości właściwości.

0

Nie sądzę - na budowie, jak wykazano, jest to najlepszy sposób, więc nie trzeba korzystać z prywatnego backer, a następnie użyć łańcucha konstruktora, aby zapewnić, że właściwość zawsze zostanie zainicjowana:

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

Byłaby to fajna funkcja; ale potem właściwości automatycznie implementowane mają na celu uproszczenie implementacji właściwości na typach; i nie widzę, jak można dodać, na poziomie języka, funkcję wartości domyślnej do właściwości automatycznej bez kodu wyglądającego trochę, dobrze, dziwnie.

Ale dlatego nie jestem projektantem języków.

0

Obawiam się, że nie można bezpośrednio zainicjować właściwości automatycznej po jej zadeklarowaniu. I zgadzam się, że szkoda. Nie znam lepszego sposobu niż konstruktor. Zobacz także Initializing C# auto-properties

3

w C# 6 można napisać coś takiego: [? Jak dajesz C# auto-PROPERTY wartość domyślną]

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

W końcu to zostało dodane do C# !!! To zadziałało dla mnie, dzięki. – lukiller

Powiązane problemy