2010-08-23 9 views

Odpowiedz

4

Stawiam przeciwne pytanie: dlaczego nie? Gdyby nie jakiś wspólny przodek, jak byś miał odniesienie do "jakiegoś obiektu dowolnego typu"? Czasami to jest potrzebne. Naprawdę, chociaż klasa System.Object ma kilka przydatnych metod, które są na ogół przydatne dla każdego typu:

  • Equals pomaga test równości
  • GetHashCode pomaga wydajności w kolekcjach
  • GetType - wszystkie obiekty mają jakiś rodzaj
  • Finalize wspierać CLR finalizacji

Ponieważ te rzeczy są wspólnie mmon dla wszystkich typów, możesz mieć kod (nawet przed rodzajami generycznymi), który inteligentnie działa na wielu typach.

Mimo to, w C# 4.0, wprowadzono dynamic, która jest naprawdę własną hierarchią klasową. Pomija on statyczne sprawdzanie typu i niekoniecznie pochodzi z object. MSDN ma na ten temat numer good article, a także interesująca jest Chris Burrows' blog series.

1

Jeśli wszystko pochodzi od jednej klasy, wtedy możesz mieć zachowania uniwersalne - takie jak "jest", "jak", ToString() i GetHashCode(). Możesz użyć tych operatorów/metod na dowolnej zmiennej.

Można również przekazać coś ogólnie jako "obiekt", co jest o wiele ładniejszym sposobem niż używanie wskaźników pustych.

+1

nawet w systemie dotnetowym niektóre klasy wywodzą się z pustych interfejsów do celów rzutowych podczas operacji progeekcyjnych – dankyy1

0

Bez tego zachowania:

  • Byłoby prawie niemożliwe, aby porównać obiektów różnych klas stosując metodę equals().
  • Nie można przechowywać instancji klasy w standardowych (nie generycznych) kolekcjach.
  • Nie można polegać na niejawnej konwersji typu String.

Ponadto, jeśli się nie mylę, cały model zarządzania pamięcią .NET obraca się wokół typu System.Object.

0

W zarządzanym świecie poświęcasz używanie wskaźników, ale masz odniesienia. Tak więc, nie można mieć coś takiego:

SomeClass obj = new SomeClass(); 
void* pObj = &obj; 

można mieć to dla typów referencyjnych (i typów wartości poprzez boks, ale to naprawdę nie to samo) za sprawą spadków:

object pObj = obj; 

Oczywiście są inne korzyści, ale głównie widziałem, używając object jako zamiennika dla wskaźników void.

Powiązane problemy