2012-05-24 29 views
31

Como se indicó anteriormente, ¿es redundante heredar de Object en C#? ¿Los dos conjuntos de códigos a continuación dan como resultado la definición de objetos equivalentes?Redundante para heredar Objeto en C#?

class TestClassUno : Object 
{ 
    // Stuff 
} 

vs

class TestClassDos 
{ 
    // Stuff 
} 

que pueda interceptar todo en MSDN, pero no fue capaz de encontrar nada perfectamente concluyentes.

+13

Cualquier definición de clase que no especifica explícitamente una clase base se heredan de 'object' implícita. –

Respuesta

33

Si se deja sin especificar todas las definiciones class implícitamente heredar de System.Object por lo tanto, las dos definiciones son equivalentes.

La única vez que estos dos serían diferentes es si alguien realmente definió otro tipo de Object en el mismo espacio de nombres. En este caso la definición local de Object tendría prioridad y cambiar el objeto de la herencia

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

mucho un caso límite, pero que no señalarlo si no hubiera visto antes

Tenga en cuenta que la Lo mismo no es cierto si usaste object en lugar de Object. La palabra clave C# object es un alias de tipo para System.Object y, por lo tanto, no coincidiría con Example.Object.

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

Por supuesto, si usted tiene un desarrollador realmente mal todavía podría causar confusión 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

¿No heredaría el 'Example.Object' local de' System.Object'? – Aren

+1

@Aren el 'Objeto' local de hecho sería pero' C' en este caso heredaría de 'Example.Object' – JaredPar

+0

Gracias por la respuesta rápida. Ciertamente no es un caso en el que hubiera pensado: buena decisión. – Keplah

20

Sí, todo lo que finalmente hereda de un objeto se define como class. Deje la herencia explícita de su código.

+1

'struct' también, en realidad. –

+0

@Cicada, tienes razón. – Aren

+1

@Cicada: 'struct' deriva * directamente * de System.ValueType. También se deriva de System.Object (todo lo hace eventualmente), pero los tipos struct no se aplican al OP porque solo pueden implementar interfaces; una construcción declarada como una estructura nunca puede derivar directamente de nada excepto ValueType. – KeithS

6

Objeto es la madre de todas las clases en .Net. No hay nada encima de eso.

Todas las clases heredan de él. Por lo tanto, este código

class TestClassDos 
{ 
    // Stuff 
} 

significa automáticamente que hereda del objeto.

Prueba: Puede escribir cualquier entidad al objeto que sea posible si hereda de ella.

Resumen de la clase 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

También encontrará' .ToString() 'en interfaces en .NET, sin embargo, las interfaces no heredan de 'System.Object'. (Estoy de acuerdo con su conclusión, pero no con la prueba que nos da). – hvd

+0

@hvd: Pero finalmente las interfaces se implementarán por clases. –

+1

Sí, o por structs, que también heredan de 'object'. Pero mi punto es que el hecho de que '.ToString()' esté disponible solo se debe a una excepción especial en el compilador que agrega los miembros 'object' incluso para algunos tipos que en realidad no heredan de' object'. – hvd

8

Sí que es redundante a heredar de objeto en la clase

7

MSDN: Object class: Soporta todas las clases en la jerarquía de clases de .NET Framework y proporciona servicios de bajo nivel a las clases derivadas. Esta es la última clase base de todas las clases en .NET Framework; es la raíz de la jerarquía de tipos.

Comprobar esta investigación: inherits from object? An investigation into how.

enter image description here

2

Sí, los dos son la misma cosa, no creo que vi a nadie estructuras mencionar, pero todos los objetos (es decir sin tener en cuenta si se declara una clase o una estructura) todos ellos en última instancia heredan de objeto, ver este Object MSDN article y este otro artículo sobre Structs