type name method ejemplos check c# .net design clr

c# - name - ¿Por qué Object.GetType() es un método en lugar de una propiedad?



type.gettype c# (5)

Las directrices dicen que una propiedad debe representar un estado del objeto, no debe ser costoso en cuanto al rendimiento, y no debe tener efectos secundarios aparte de calcular / establecer ese estado. Supongo que GetType () no respeta estas reglas, así que lo convirtieron en un método.

GetType () es una operación un poco costosa. Si fuera una propiedad, fomentaría usos como

DoStuff(obj.Type); .... DoStuff(obj.Type);

etc.

en lugar de

Type type = obj.GetType(); DoStuff(type); .... DoStuff(type);

y eso no sería tan óptimo. Entonces lo hicieron un método para sugerir que debería llamarse con moderación.

Desde una perspectiva de diseño, me pregunto por qué los creadores de .NET eligieron System.Object.GetType () en lugar de una propiedad de solo lectura System.Object.Type.

¿Es solo una falla de diseño (muy leve) o hay una razón detrás de eso? Cualquier luz bienvenida.


Según tengo entendido, en general se considera una buena práctica que los campos internos o valores que son triviales calculen como expuestos mediante una propiedad, y que otros valores, que pueden requerir más tiempo u otros recursos para calcular, se expongan mediante un método .


Si observa la declaración GetType () en Reflector, encontrará esto:

[MethodImplAttribute(MethodImplOptions.InternalCall)] public extern Type GetType();

Lo que significa esa combinación de atributo y extern es que este método se implementa realmente en código no administrado dentro del tiempo de ejecución de .NET. La pregunta GUID en este artículo entra en más detalles. Obviamente lo hicieron por motivos de rendimiento después de determinar que averiguar el tipo sería más rápido si se maneja en un nivel inferior.

Esto lleva a dos razones para no implementar el método GetType como una propiedad. En primer lugar, no puede definir las propiedades externas como puede con los métodos, por lo que debería manejarse en el código .NET nativo. En segundo lugar, incluso si pudieras definirlos como externos, realizar una llamada insegura y no administrada desde dentro de una propiedad definitivamente rompería las pautas para el uso de la propiedad ya que es mucho más difícil garantizar que no haya efectos secundarios.


Solo Microsoft puede responder esa pregunta, pero creo que es porque varias clases en .NET Framework crean sus propias versiones sobrecargadas de GetType () con parámetros adicionales. Si hubiera sido una propiedad, no podrían usar el mismo nombre (porque las propiedades no tienen parámetros).

Solo mis pensamientos sobre el tema.


Un poco tarde de respuesta, pero se estrelló en la pregunta al tratar de encontrar algo relacionado.

Es posible que GetType arroje una excepción. Las directrices del marco establecen que las propiedades no deben arrojar excepciones. Esta es una razón más por la que debería ser un método en lugar de una propiedad.