2009-02-10 19 views

Odpowiedz

7

Typowym przykładem jest struktura, która jest członkiem obiektu przydzielonego do sterty. W tym pytaniu jest dużo dodatkowych szczegółów. What’s the difference between struct and class in .Net?

+0

ale nie jest strukturą prawie ZAWSZE członkiem obiektu przypisanego do sterty? czy nie jest tak wszędzie, z wyjątkiem sytuacji, gdy struktura jest po prostu zmienną lokalną? –

+0

Prawie wszędzie. Struktura może również być statycznym elementem klasy, w którym to przypadku nie jest członkiem obiektu, a mimo to jest alokowana na stercie. – yfeldblum

+0

@Simon_Weaver Zmienna typu wartości przekazywana do metody. Nie musi być zdefiniowana w metodzie. Jesteś zagmatwany mechaniki z częstotliwością w użyciu. Najważniejsza jest mechanika, a nie jak często jest używana. –

2

Gdy instancja pliku value type otrzymuje boxed, pole, a tym samym sama instancja, zostaje przeniesione do sterty. Chociaż nie ma wątpliwości, że instancja typu wartości klasy innego niż klasa, gdy jest tworzona po raz pierwszy, zawsze jest tworzona na stosie.

Struktura to typ wartości. Tak więc zachowuje się jak powyżej.

+0

Sam typ pudełkowy jest w rzeczywistości typem referencyjnym, pamiętajcie. Każdy typ wartości ma rodzaj niejasnej wersji typu odniesienia dla boksu. To trochę skomplikowane. Przypadek "członek klasy" jest znacznie mniej dyskusyjny IMO :) –

+0

Technicznie, typ wartości jest kopiowany do elementu pola, które już istnieje na stercie. Więc nie "przenosi się" na stertę. Termin typ w ramce jest mylący. Ułatwiam sobie, jeśli chcesz, aby typ wartości działał jako typ referencyjny, aby już był typem referencyjnym. Typy wartości powinny być zarezerwowane dla niezmiennych lub transfer danych przez potok do strony trzeciej. –

4

Gdy są one na polu w klasie

Nietypowe przykłady to:

a: Kiedy zmienna wartość typu jest zrobione:

int i = 2; 
Action action = delegate {i++;} 
action(); 
Console.WriteLine(i); 

To jest kompilowany do czegoś więcej informacji:

class Foo { 
    public int i; 
    public void Bar() {i++;} 
} 
... 
Foo foo = new Foo(); 
foo.i = 2; 
Action action = foo.Bar; 
action(); 
Console.WriteLine(foo.i); 

b: gdy wartość zmiennej typu jest stosowane w bloku iteracyjnej:

IEnumerable<int> GetValues() { 
    for(int i = 0 ; i < 5 ; i++) yield return i; 
} 

(kompilator generuje stan maszyny do reprezentowania iteracyjnej, z których wszystkie zmienne lokalne (takie jak i) pola są)

2

Wystarczy jako przykład the answer from 1800 INFORMATION:

public class Foo 
{ 
    int x; 

    public Foo(int y) 
    { 
     x = y; 
    } 
} 

... 

Foo foo = new Foo(10); 

teraz, po zakończeniu wykonywania konstruktora, wartość foo.x wynosi 10. Gdzie jest foo.x w pamięci? Na stercie. Jaki jest typ foo.x? int aka System.Int32, która jest strukturą.

Pozostałe odpowiedzi dotyczące przechwyconych zmiennych i boksu itp. Są również poprawne ("sortowanie" w boksie - dodam komentarz), ale ten przykład jest najprostszy i najważniejszy, IMO.

+0

Czy wszystkie typy wartości są strukturami? – mmcdole

+0

Istnieją pewne konstrukcje i wyliczenia - sądzę, że to dużo. –

+0

.Net jest dziwne. Int jest strukturą. Jako programista w C++, który zajmie trochę przyzwyczajenia się do –

0

już wspomniano dogłębnie przez innych

  • pole Użytkownik wartości
  • pudełkowane konstrukcjom (ściśle są one już wtedy typy wartości)

Ponadto:

  • tablica struktur znajduje się całkowicie na stercie.
  • statyczne struktury (nie na stosie lub sterty, ale w specjalnym obszarze samodzielnie)
+0

boxed structs/array of/static == pole członka –

0

Książka popełniła błąd polegający na pomieszaniu mechaniki pisania z mechaniką zakresu. Typ wartości nie jest typem odniesienia. To dane są kopiowane, gdy wywołujesz metodę używającą go jako argumentu (bez ref lub out). Typy wartości będą żyły na stosie w zakresie metody, a nie na stercie jako obiekt odniesienia, ale to nie znaczy, że zawsze będzie na stosie.

W związku z tym książka robi oświadczenie o użyciu zamiast oświadczenia mechanika i mylące dwa. To nie jest całkowite bezpodstawne roszczenie, ale jest błędne.

Typy wartości będą się odbywać bez względu na to, gdzie jest ich właściciel.

Więc jeśli ich zasięg jest metodą, będą na stosie. Jeśli ich zasięg jest obiektem, będą żyć z obiektem na stercie.

Przy tym jest całkiem bezpiecznie powiedzieć, że typ wartości najlepiej pozostawić jako niezmienny, ponieważ większość ludzi ma trudności z przewidywaniem mechaniki wartości wartości podrzędnej.

Powiązane problemy