2011-03-27 14 views
32

En el primer ejemplo de log4net configuration manual el autor usa typeof(MyApp) para obtener el tipo de la clase que contiene MyApp. ¿Hay alguna razón para no usar this.GetType(), en términos de rendimiento? Porque me parece que this.GetType() es mucho más seguro que los posibles errores de copiar y pegar al copiar en otra clase.C# performance question: typeof (MyClass) vs. this.GetType()

+4

Cuando no tiene ninguna instancia, solo TYPEOF está disponible, ¿no es así? –

Respuesta

77

typeof (Foo) es una búsqueda de tipo estático; esencialmente ocurre en tiempo de compilación, por lo que solo obtiene el tipo de nombre explícito.

GetType() es una búsqueda dinámica de tipos; es un método virtual que se llama en el tiempo de ejecución y le dará el tipo exacto, incluso si está utilizando el polimorfismo. Entonces, es "más lento" teóricamente, pero te está dando algo que no puedes obtener de typeof (T). Si necesita uno u otro para su diseño, la velocidad no será un factor.

+1

mike - cortó los "comentarios" y proporcionó una definición concisa aquí. +1 –

13

Problemas de rendimiento aparte, en el ejemplo proporcionado, GetType ni siquiera es una opción porque es un instancia método; no se puede invocar desde un inicializador de campo. En cualquier caso, dado que la intención es inicializar un campo estático desde un 'contexto' estático, lógicamente una referencia this no puede estar disponible, por lo que bajar la ruta del constructor estático tampoco ayudaría con GetType.

// Can't use GetType() - the this reference is not available. 
private static readonly ILog log = LogManager.GetLogger(typeof(MyApp)); 
+0

Tienes razón, qué estúpido de mi parte no haber notado la palabra clave 'static' :) –

+2

@Ani, pero ¿y el rendimiento, cuando se conocen tanto el objeto como el nombre del tipo? – Shimmy