2009-11-02 22 views
6

Jaka jest definicja value class i reference class w języku C#?Co to jest klasa wartości i jaka jest klasa odniesienia w języku C#?

Czym się to różni od value type i reference type?

Zadaję to pytanie, ponieważ przeczytałem to w samodzielnym zestawie treningowym MCTS (egzamin 70-536). Rozdział 1, Lekcja 1, ocena Lekcja 4:

Trzeba utworzyć prostą klasę lub strukturę, która zawiera tylko wartość typy. Należy utworzyć strukturę klasy lub , tak aby działała jak najskuteczniej jako . Użytkownik musi być w stanie przekazać klasę lub strukturę do procedurę bez obawy, że procedura ją zmodyfikuje. Którego z poniższych założeń należy utworzyć?

Odniesienie klasa

struktura odniesienia B

wartość C klasa

struktura wartość D

Prawidłowa odpowiedź: D

Niepoprawnie: Można by utworzyć klasę odniesienia ; Jednak po przejściu do procedury może zostać zmodyfikowany jako .

B Niepoprawnie: Nie można utworzyć struktury referencyjnej .

C Niepoprawne: Można utworzyć wartość klasy ; jednak struktury są bardziej wydajne.

D Prawidłowo: Struktury wartości to zwykle najbardziej efektywne.

+0

Zanim zredagowałeś swoje pytanie, powiedział "Klasa wartości" i "Klasa odniesienia" w przeciwieństwie do "typu". Mógł odnosić się do czegoś w tym kierunku: http://www.icsi.berkeley.edu/~sather/Documentation/EclecticTutorial/node7.html gdzie brzmi: "Na poziomie podstawowym: klasy wartości definiują obiekty, które po utworzeniu nigdy nie zmieniaj ich wartości Zmienna typu wartości może być zmieniona tylko przez ponowne przypisanie do tej zmiennej.Jeśli chcemy zmodyfikować tylko część części klasy wartości (jeden atrybut, powiedzmy), jesteśmy zmuszeni do ponownego przypisania całego obiektu "... Bez linku do artykułu, kto wie. –

+1

Nie zredagowałem pytania. Ktoś zrobił to za mnie. To złe wydanie. Mam na myśli "value CLASS" i "reference CLASS". –

+0

Tak, zdaję sobie sprawę, że to George Stocker zredagował twoje pytanie. Właśnie wskazywałem, że być może miałeś na myśli dokładnie to, co wpisałeś. Wygląda na to, że właśnie to wyjaśniłeś. –

Odpowiedz

2

Typy wartości są przekazywane przez wartość, natomiast typy referencyjne są przekazywane przez referencję.

Edit: Klasy/wartość odniesienia
nie ma pojęcia o „klasie” lub „wartości referencyjnej klasy” w C#, więc z prośbą o jego definicji jest dyskusyjna.

+2

Być może, jeśli dał nam łącze do dokumentu, do którego się odnosił ... –

+0

Dodałem dokument referencyjny –

+1

Typy referencyjne są przekazywane przez wartość, ale referencja jest przekazywana. To subtelne, ale ważne rozróżnienie. – Wedge

3

Zobacz the overview w tej sprawie, ale poważnie się linki msnd i przeczytać pełną Common Type system rozdział niego. (Można również zadać pytanie w pierwszym pytaniu)

1

Typy wartości przechowują rzeczywiste dane, podczas gdy typy odniesienia przechowują odwołania do danych. Typy referencyjne są przechowywane dynamicznie na stercie, podczas gdy typy wartości są przechowywane na stosie.

Rodzaje Wartość: http://msdn.microsoft.com/en-us/library/s1ax56ch.aspx referencyjne typów: http://msdn.microsoft.com/en-us/library/490f96s2.aspx

+2

Nie jest dokładne. Typy wartości, które są polami klas, są przechowywane na stercie między resztą stanu obiektu. – zvolkov

+1

http://blogs.msdn.com/ericlippert/archive/2009/04/27/the-stack-is-an-implementation-detail.aspx – Joren

+0

tak, moje wyjaśnienie było trochę nazbyt uproszczone – jtruelove

1

Gdy odwołujesz się do typu wartości (czyli używając jego nazwy), mówisz o miejscu w pamięci, w którym znajdują się dane.Jako takie, typy wartości nie mogą być puste, ponieważ lokalizacja pamięci nie może powiedzieć "nic nie reprezentuję". Domyślnie przekazujesz wartości według wartości (tzn. Obiekt, który przekazujesz do metod, nie zmienia się w wyniku wykonania metody).

Podczas korzystania z obiektu typu odniesienia, w rzeczywistości używasz ukrytego wskaźnika. Nazwa odnosi się do miejsca w pamięci, które następnie odwołuje się do miejsca w pamięci, w którym faktycznie znajduje się obiekt. W związku z tym można przypisać wartość zerową do typu odniesienia, ponieważ mają one sposób na powiedzenie "Nie wskazuję nigdzie". Typy referencyjne pozwalają również na zmianę obiektu w wyniku wykonywania metod, więc możesz zmienić właściwości myReferenceObject, przekazując je do wywołania metody.

0

Typy referencyjne są przekazywane do metod przez odniesienie i typy wartości według wartości; w tym drugim przypadku metoda otrzymuje kopię zmiennej, a w pierwszym otrzymuje odniesienie do oryginalnych danych. Jeśli zmienisz kopię, oryginał się nie zmieni. Jeśli zmienisz oryginalne dane, do których masz odniesienie, dane zmieniają się wszędzie, gdy odniesienie do danych zostanie zmienione. Jeśli podobny program do twojego programu C# został utworzony w C, generalnie typy odniesienia będą jak dane wykorzystujące wskaźniki, a typy wartości będą normalnymi danymi na stosie.

Typy liczbowe, znakowanie, data, wyliczenia i struktury są typami wartości. Ciągi, tablice, delegaty i klasy (to znaczy, większość rzeczy naprawdę) są typami odniesienia.

2

Być może myślisz o C++/CLI, który, w przeciwieństwie do C#, pozwala użytkownikowi zadeklarować "klasę wartości" lub "klasę odniesienia". W języku C# każda zadeklarowana klasa będzie domyślnie klasą odniesienia - tylko wbudowane typy, konstrukcje i wyliczenia mają semantykę wartości. Aby przeczytać o klasie wartości w C++/CLI, spójrz tutaj: http://www.ddj.com/cpp/184401955

klas Wartość mają bardzo małą funkcjonalność w porównaniu do klas ref, i są przydatne dla „zwykłego starych danych”; to znaczy dane, które nie mają tożsamości. Ponieważ kopiujesz dane podczas przypisywania ich do siebie, system dostarcza domyślnego (i obowiązkowego) konstruktora kopiowania, który po prostu kopiuje dane do innego obiektu.

Aby przekonwertować klasę wartości na klasę odniesienia (a tym samym umieścić ją na kupie zbierającej śmieci), można ją "skrzynkować".

Aby zdecydować, czy pisana przez Ciebie klasa jest jedną lub drugą, zadaj sobie pytanie, czy ma ona tożsamość. Zwykle oznacza to, że ma jakiś stan, lub ma identyfikator lub nazwę, lub pojęcie własnego kontekstu (na przykład węzeł wskazujący na pobliskie węzły).

Jeśli nie, prawdopodobnie jest to klasa wartości.

W języku C# klasy wartości są jednak zadeklarowane jako "structs".

0

Jeśli moje zrozumienie jest poprawne, można wykonać "klasę wartości" lub klasę niezmienną, korzystając z zmiennych elementarnych readonly inicjowanych przez konstruktor. Po utworzeniu nie można ich zmienić.

Powiązane problemy