2012-01-27 13 views
7

Mam właściwość takiego:Czy właściwości mają zawsze wartość po wyłączeniu?

public Tuple<String, String>[] Breadcrumbs { get; set; } 

i mam egzamin w jednym z moich metod takich jak to:

if (Breadcrumbs != null && Breadcrumbs.Length > 0) { } 

zależności od tego kiedy ta metoda jest wywoływana, Breadcrumbs może nie zostały ustawione . W jednym teście Breadcrumbs == null evaulates to true.

Czy domyślne właściwości będą zawsze miały wartość? (Czy zawsze będzie to null?)

Odpowiedz

18

Właściwość zaimplementowana automatycznie, która nie została jawnie ustawiona przez żaden kod, zawsze będzie miała domyślną wartość dla typu właściwości - która jest pusta dla typów odniesienia. (Dla int będzie to 0, dla char będzie to "\ 0" itp.).

Automatycznie realizowane nieruchomość jak to tylko równoważne:

private PropertyType property; 
public PropertyType Property 
{ 
    get { return property; } 
    set { property = value; } 
} 

... oprócz tego, że zmienna podkład ma niewypowiedziane imię (nie można odwoływać się do niego w kodzie), więc to będzie zawsze zaczynaj od wartości domyślnej dla typu.

+2

+1 za "niewypowiedziane imię" :) –

3

Auto-właściwości korzystają z pól pomocniczych i są kompilowane do zwykłych właściwości.

Jeśli typ właściwości jest typem odniesienia, wartość będzie równa zeru, jeśli nie, wartość będzie wartością domyślną

2

Zmienne składowe klasy (zwane polami), a tym samym zabezpieczające zmienne właściwości, są zawsze inicjowane do ich wartości domyślnych, jeśli nie zostały zainicjowane jawnie, tj. null dla typów odniesienia. Wartością domyślną dla wszystkich typów jest wartość, której reprezentacja binarna składa się ze wszystkich bitów ustawionych na 0.

Z drugiej strony C# wymaga jawnego zainicjowania zmiennych lokalnych. Są to: zmienne zadeklarowane w metodach, konstruktorach i akcesoriach własności oraz parametry metody; tzn. są traktowane jako nieokreślone, dopóki nie przypiszesz im wartości.

+0

Ups, kodowałem C# aż do teraz pod wrażeniem, że muszę zainicjować wszystko lub ryzykować znalezienie losowych śmieci. Myślę, że utrzymam ten nawyk, więc nie popełniam jednego z tych strasznie subtelnych błędów, kiedy wrócę do C. – Oliver

+0

Kompilator C# jest dobry w wykrywaniu potencjalnie niezainicjowanych zmiennych, więc nie martw się zbytnio! –

+2

@Oliver: Nie, nigdy nie znajdziesz przypadkowych śmieci; Menedżer pamięci zawsze go inicjuje. (W bezpiecznym kodzie, w niebezpiecznym kodzie, jesteś samemu, dlatego nazywany jest "niebezpieczny".) Jednak C# wymaga natychmiastowego zainicjowania wszystkich lokalnych zmiennych przed ich odczytaniem; to nie przeszkadza ci w zobaczeniu śmieci, to zapobiegnie pisaniu błędów. –

0

Jest logicznie niemożliwe, aby nie miał wartości. Będzie musiał zwrócić coś, kilka paczek 1s i 0, co najmniej jest uważane za odniesienie do Tuple<String, String>[], więc w tym zakresie ma wartość.

To także zdarza się, że wszystkie pola w klasach gotowi do ich wartości domyślnych (default(T) dla każdego typu T są, co jest null dla wszystkich typów referencyjnych). W przeciwnym razie możliwe byłoby posiadanie obiektu, który był w stanie, który nie tylko nie miałby sensu pod względem tego, co robi, ale który nie miał żadnego sensu przez reguły tego, co .NET oczekuje, że obiekty wykonają. Obejmuje to ukryte pola za właściwościami automatycznymi.

Teraz, w niektórych językach możemy zrobić odpowiednik tego:

public Tuple<String, String>[] Breadcrumbs 
{ 
    get 
    { 
    Tuple<String, String>[] whatIWillSend; 
    return whatIWillSend; 
    } 
} 

Jeśli to pozwolono, whatIWillSend będzie mieć wartość nie zdefiniowaną przez dowolną concious decyzji z twojej strony, ale przez to, co stało się w pamięci w tym czasie. Może to być wartość pusta, może być poprawna Tuple<String, String>[] przez zwykły zbieg okoliczności (ale nie ten, którego chciałeś użyć!), może to być Dictionary<int, List<string>>, że środowisko wykonawcze będzie teraz uważało, że w rzeczywistości jest to Tuple<String, String>[] (nie ma bezpieczeństwa typowego dla całego systemu), może to być jedna czwarta struktury decimal. (W językach, które dopuszczają takie rzeczy, może to być również dobrze znana wartość, że debuggery dla takich języków są ustawiane właśnie w takich przypadkach, aby pomóc znaleźć błędy spowodowane przez to).

To jest najbliższa rzecz, jaką możemy dostać do nieruchomości, która nie ma wartości. Należy jednak pamiętać, że:

  1. Wartość nadal będzie miała wartość, ale nie będzie miała znaczącej wartości.
  2. Nie możemy tego robić w C#.
Powiązane problemy