2011-01-19 11 views
10

Moje pytania są następujące:W języku C#, korzystanie z typów wartości w porównaniu z typami referencyjnymi

  • Kiedy powinniśmy używać typów wartości odniesienia typów i kiedy?
  • Jakie są zalety i wady jednej nad drugą?
  • Co, jeśli wszędzie używa się typów odniesienia? Czy jest w tym jakaś szkoda?

Proszę również omówić zalety i wady każdego z nich. Chcę to również zrozumieć.

+2

Jeśli nie możesz zdecydować, to prawie na pewno "klasa". Jest to niezwykle rzadkie, aby * legalnie * pisać strukturę. –

+1

Dla tureckich programistów, mam wpis na blogu na ten temat http://sonergonul.net/2012/12/net-icerisinde-deger-tipi-ve-referans-tipi/ –

Odpowiedz

4

Wydaje się, że jest w tym sporo zamieszania, a Jon Skeet wykonuje dobrą robotę, oczyszczając go z książki "C# In Depth, 2nd Ed." (sekcja 2.3).

Moje osobiste podejście, które może ale nie musi być słuszne, polega na użyciu TYLKO struktur/wyliczeń (typów wartości) do reprezentowania lekkich, atomowych struktur danych, o których wiem, że będę często używał w jakimś logicznym lub matematycznym operacje - pomyśl Point, itp.

W ten sposób mogę uniknąć kary za odbiór śmieci. Jednak Jon wskazuje w tej części swojej książki, że nie ma prawdziwej gwarancji, szczególnie w nowych wersjach środowiska wykonawczego, czy coś pójdzie na stos w ogóle.

Moja najlepsza odpowiedź polega na oszczędnym używaniu elementów takich jak structs i byciu bardzo świadomym, dlaczego ich używasz. Uważaj na przedwczesną optymalizację. I przeczytaj tę sekcję w książce Jona, jeśli możesz zdobyć kopię, ponieważ dobrze radzi sobie z wyjaśnianiem tego całego tematu.

pokrewne: When to use struct?

7

Stosuj typy wartości dla niezmiennych, które nie mają własnej tożsamości (a 1 oznacza 1), użyj typów odniesienia dla innych rzeczy.

+5

Czy łańcuchy mają tożsamości? :) –

+0

Więc '" 1 "' nie jest '" 1 "'? – jason

+0

@Jon - specjalny przypadek ... i można argumentować, że łańcuchy powinny zostać zaimplementowane jako typy wartości. Chciałbym usłyszeć twoje zdanie na ten temat. – Oded

9

Należy używać typów wartości dla małych, niezmiennych typów, które reprezentują wartości.
Never make mutable structs.

We wszystkich innych przypadkach używaj typów referencyjnych.

+1

+1 z naciskiem na * mały *. (copy-on-assignment) –

+1

Twój wpis nie wyjaśnia, dlaczego należy używać typów wartości? – Nawaz

2

http://www.albahari.com/valuevsreftypes.aspx

to mój odniesienia w tej kwestii. Używam głównie typów referencyjnych tbh. Klasy IE, a nie struktury. Główną kwestią, o której często się mówi, jest to, że struktury powinny być używane tylko dla małych informacji. Rzeczywiście zależy od dokładnych okoliczności. Rzuć okiem na strukturę .net w przeglądarce obiektów, która powinna pomóc, zobaczysz, co zrobili użytkownicy Microsoftu i możesz analizować, dlaczego stworzyli pewne klasy i struktury.

1

Niezmienne typy wartości i niezmienne typy referencyjne są semantycznie wszystko jednak identyczne; jedyne różnice polegają na tym, że typy referencyjne obsługują sprawdzanie równości referencyjnej, które mogą, ale nie muszą być znaczące, i że typy wartości mogą być zawijane w wartość zerową (z T), podczas gdy typy odniesienia są niejawnie zerowalne. Jeśli typ będzie niezmienny, zależnie od tego, w jaki sposób będzie on używany, mogą istnieć powody związane z wydajnością, aby faworyzować strukturę lub klasę; Struktury są szybsze w przypadku niektórych operacji (prawie wszystkie operacje, w przypadku rozmiarów mniejszych niż cztery bajty), podczas gdy klasy mogą być szybsze dla niektórych innych (szczególnie dla rzeczy większych niż 16 bajtów). Co więcej, niektóre typy operacji są zasadniczo niemożliwe przy użyciu struktur.

Zmienne typy struktur są użyteczne, w przeciwieństwie do twierdzeń niektórych użytkowników, ale są pewne zastrzeżenia. Jeśli mamy zmienną, która zawiera odniesienie do zmiennego obiektu klasy, a ktoś robi coś, aby zmienić ten obiekt, ta zmiana będzie skutecznie "widziana" przez wszystko, co zawiera odniesienie do tego obiektu. Jeśli ktoś chce zmienić obiekt bez naruszania czegokolwiek innego, musi wiedzieć, że jest jedyną referencją do tego obiektu. Często jedynym sposobem, aby się tego upewnić jest skopiowanie wszystkich danych z obiektu do nowej instancji obiektu, a następnie wprowadzenie zmiany do tej nowej instancji. Natomiast jeśli mamy zmienną strukturę, można po prostu wprowadzić dowolne zmiany, bez konieczności tworzenia nowej instancji.

Jedynym prawdziwym problemem z zmiennymi strukturami jest to, że .net używa różnych abstrakcji, aby zachowywać się jak część jednolitego systemu typów, a abstrakcje te mogą powodować, że kopie struktur będą używane w miejscach, w których logicznie powinny być używane oryginały . Nie zawsze jest oczywiste, kiedy te substytucje mogą wystąpić, i mogą prowadzić do mylącego i błędnego zachowania.

Powiązane problemy