2012-05-24 13 views
31

Come detto sopra, è ridondante ereditare da Object in C#? Entrambi i gruppi di codici seguenti determinano la definizione di oggetti equivalenti?Ridondante per ereditare da Object in C#?

class TestClassUno : Object 
{ 
    // Stuff 
} 

vs.

class TestClassDos 
{ 
    // Stuff 
} 

ho intercettati in giro su MSDN, ma non sono riuscito a trovare niente di perfettamente conclusivo.

+13

Qualsiasi definizione di classe che non specifica esplicitamente una classe base erediterà da 'object' implicitamente. –

risposta

33

Se lasciato non specificato ogni definizione class implicitamente ereditare da System.Object quindi le due definizioni sono equivalenti.

L'unica volta che questi due sarebbero diversi è se qualcuno abbia effettivamente definito un altro tipo Object nello stesso spazio dei nomi. In questo caso la definizione locale di Object avrebbe la precedenza e modificare l'oggetto eredità

namespace Example { 
    class Object { } 
    class C : Object { } 
} 

Molto un caso d'angolo, ma non ricorda che se non avessi visto prima

Si noti che la lo stesso non è vero se hai usato object invece di Object. La parola chiave C# object è un alias di tipo per System.Object e quindi non corrisponde a Example.Object.

namespace Example2 { 
    class Object { } 
    class C : Object { } // Uses Example.Object 
    class D : object { } // Uses System.Object 
} 

Naturalmente se si dispone di uno sviluppatore veramente male si potrebbe ancora causare confusione con object

namespace System { 
    class Object { 
    private Object() { } 
    } 
} 

namespace Example3 { 
    // This will properly fail to compile since it can't bind to the private 
    // Object constructor. This demonstrates that we are using our definition 
    // of Object instead of mscorlib's 
    class C : object { } // Uses our System.Object 
} 
+7

Il 'Local.Object' locale non erediterà ancora da' System.Object'? – Aren

+1

@Aren l'oggetto 'Local' sarebbe, ma in questo caso,' C' erediterebbe da 'Example.Object' – JaredPar

+0

Grazie per la risposta rapida. Non è certamente un caso a cui avrei pensato: buona chiamata. – Keplah

20

Sì, tutto eredita in definitiva da un oggetto se definito come class. Lascia l'ereditarietà esplicita del tuo codice.

+1

'struct' too, in realtà. –

+0

@Cicada, hai ragione. – Aren

+1

@Cicada: 'struct' deriva * direttamente * da System.ValueType. Deriva anche da System.Object (tutto alla fine), ma i tipi di struct non si applicano nemmeno all'OP perché possono solo implementare interfacce; un costrutto dichiarato come struct non può mai derivare direttamente da qualsiasi cosa tranne ValueType. – KeithS

6

L'oggetto è la madre di tutte le classi in .Net. Non c'è niente sopra di esso.

Tutte le classi ereditano da esso. Quindi questo codice

class TestClassDos 
{ 
    // Stuff 
} 

significa automaticamente che si eredita dall'oggetto.

Prova: È possibile digitare qualsiasi entità su oggetto che è possibile se ne eredita.

Sintesi classe Object dice

// Supports all classes in the .NET Framework class hierarchy and provides low-level 
// services to derived classes. This is the ultimate base class of all classes 
// in the .NET Framework; it is the root of the type hierarchy. 
+0

Troverai anche' .ToString() 'nelle interfacce in .NET, tuttavia le interfacce non ereditano da 'System.Object'. (Sono d'accordo con la tua conclusione, non solo con la prova che dai.) – hvd

+0

@hvd: Ma alla fine le interfacce saranno implementate dalle classi. –

+1

Sì o tramite le strutture, che ereditano anche da 'object'. Ma il mio punto è che il fatto che '.ToString()' sia disponibile è solo a causa di un'eccezione speciale nel compilatore che aggiunge i membri di 'object' anche per alcuni tipi che in realtà non ereditano da' object'. – hvd

8

sì, è ridondante di ereditare da oggetti in classe

7

MSDN: Object class: Supporta tutte le classi nella gerarchia di classi .NET Framework e fornisce servizi di basso livello alle classi derivate. Questa è l'ultima classe base di tutte le classi in .NET Framework; è la radice della gerarchia di tipi.

Controllare questa ricerca: inherits from object? An investigation into how.

enter image description here

2

Sì, sono entrambi la stessa cosa, non credo che ho visto nessuno le strutture menzione, ma tutti gli oggetti (cioè a prescindere se si dichiara una classe o di una struttura) che tutti ereditano da Object , vedere questo Object MSDN article e questo altro articolo su Structs