2010-04-07 22 views
41

Lubię C#, ale dlaczego mogę zrobić:Domyślna wartość właściwości statycznej

public static bool Initialized { private set; get; } 

lub to:

public static bool Initialized = false; 

ale nie mieszają zarówno w jednej linii?

Po prostu muszę ustawić poziom dostępu do mojej zmiennej (zestaw prywatny) i potrzebuję jej ustawić na false podczas uruchamiania. Nie chciałbym tworzyć tej nudnej zmiennej prywatnej _Initialized, która byłaby zwracana przez getter publicznych Initialized var. Lubię mój kod, żeby był piękny. (Uwaga: moja zmienna jest statyczna, nie można jej zainicjować w konstruktorze).

Dzięki

+3

To może być inicjowane w konstruktorze, gdy konstruktor jest statyczna też! – snicker

+7

Czy to nie będzie FALSE domyślnie i tak lol?W każdym razie doceniam, że zadajesz ogólne pytanie. –

+0

W odróżnieniu od zmiennych lokalnych, które są domyślnie niezdefiniowane, pola (zmienne poziomu klasy), a tym samym również zmienne zapasowe właściwości są zawsze inicjowane do wartości domyślnej, która jest "false" dla wartości logicznych. –

Odpowiedz

49

Można użyć static constructor

static MyClass() 
{ 
    Initialized = false; 
} 

Jednakże, jak już wspomniano przez innych domyślną wartość bool będzie fałszywa.

+11

Statyczne konstruktorzy to życie imprezy. – snicker

6

Można po prostu zrobić:

public static bool Initialized { private set; get; } 

Od bool wartości są zawsze fałszywe domyślnie, nie ma potrzeby, aby go zainicjować.

Jeśli chcesz, aby było to prawdą domyślnie lub aby była bardziej złożona, musisz to zrobić w konstruktorze statycznym lub użyć pola pomocniczego.

chodzi o „Lubię mój kod, aby być piękne” - osobiście, na inny niż domyślny inicjalizacji, myślę, że jest to po prostu jako „piękny”:

private static bool initialized = true; 
public static bool Initialized { get { return initialized; } } 

To sprawia inicjalizacji do non domyślnie bardzo widoczne, co nie jest złe.

+1

Nie sądzę, że jest "tak piękna", z perspektywy IntelliSense, teraz masz dwie zmienne, które są dostępne pod tą samą nazwą, tylko z innym przypadkiem, z których jeden jest całkowicie tylko do odczytu. Również ... (to jest czysto z punktu widzenia adwokata diabła) co się stanie, jeśli specyfikacja C# zmieni się, a wartość domyślna bool stanie się prawdziwa? Jest mało prawdopodobne, ale lepiej jest jawnie niż zakładać. – snicker

+0

@snicker: Ustawienie domyślne bool jest częścią specyfikacji C# - to się nie zmieni. Jeśli chodzi o intellisense, zobaczysz tylko właściwość "Initializer" tylko do odczytu, chyba że jesteś w środku metody w klasie, w takim przypadku, jest całkiem oczywiste, która jest która przez obudowanie ... –

+0

Wiem, ja robił pół żart o specyfikacji. Nadal nie chciałbym widzieć "zainicjalizowanych" i "Zainicjowanych" na liście, gdy często będę wpisywać małymi literami i korzystać z opcji "tab-completion". Nie wiem na pewno, który dostanę (będzie to ostatni wybrany przy użyciu Intellisense). – snicker

3

Dwa bloki kodu, o których wspomniałeś, to dwie różne rzeczy.

Pierwszy blok to auto implemented property defination. Jest to cukier syntaktyczny dla pełnego defination nieruchomości, które wygląda następująco:

private static bool _initialized; 
public static bool Initialized 
{ 
    private set 
    { 
     _initialized = value; 
    } 
    get 
    { 
     return _initialized; 
    } 
} 

Twój drugi blok kodu jest static member definition. Jeśli spojrzysz na rozszerzenie, które podałem powyżej, zauważysz, że zawiera on definicję prywatnego statycznego elementu. Jeśli chcesz, aby zapewnić wartość początkową można to zrobić tutaj:

private static bool _initialized = false; 
public static bool Initialized 
{ 
    private set 
    { 
     _initialized = value; 
    } 
    get 
    { 
     return _initialized; 
    } 
} 

Definicja nieruchomość inline jesteś korzystając został zaprojektowany tak, aby kod nieco krótszy w najbardziej powszechnym przypadku. Jeśli chcesz zrobić cokolwiek innego, możesz użyć pełnej formy kodu nieruchomości.

Alternatywnie można przejść zupełnie inną trasę i użyć statycznego konstruktora. (Patrz Corey's answer)

+2

"Cukier syntaktyczny" jest tym, co tworzy "piękny kod". Jestem pewien, że OP * wie *, że tak właśnie się dzieje, ale specjalnie poprosił o rozwiązanie, które jest porównywalne "piękno" ... dla którego myślę, że konstruktor statyczny jest najlepszą ścieżką. – snicker

11

Ponieważ C# 6:

public static bool Initialized { private set; get; } = false; 
Powiązane problemy