2010-06-30 17 views
7

Algo en lo que he estado pensando de vez en cuando: ¿Por qué se necesita el operador typeof en C#? ¿El compilador no sabe que public class Animal es un tipo solo por la definición? ¿Por qué debo especificar SomeMethod(typeof(Animal)) cuando necesito hacer referencia a un tipo?¿Por qué se necesita typeof?

Respuesta

4

typeof(Class) es la única forma de expresar Tipo como literal. Cuando escribe Class.SomeField, quiere decir campo estático. Cuando escribe typeof(Class).SomeField, hace referencia al campo del objeto de la clase Type que representa su clase.

+1

Sí, pero la pregunta es: ¿por qué? –

+0

@Daniel Earwicker ¿por qué? para distinguir miembros estáticos y miembros de tipo. – Andrey

+0

Ah, ya veo, me perdí esa parte de la respuesta, ¡oh! +1 –

1

Reflejo para los principiantes. Hay muchas posibilidades disponibles cuando puede inspeccionar el tipo en sí, en lugar de simplemente tener que saber qué expone o si existe.

6

Animal es simplemente el nombre del tipo, typeof(Animal) devuelve el objeto de tipo real (instancia System.Type). Claro, puede haber sido posible que el nombre del tipo devuelva el tipo de objeto en el código, pero hace el trabajo mucho más difícil para el compilador/analizador (reconociendo cuando un nombre de tipo significa typeof o algo más) - de ahí la existencia de la palabra clave typeof. También podría decirse que hace que el código sea más claro de leer.

+2

También puede nombrar propiedades como tipos (comunes para cosas como 'Color' más o menos) que pueden confundir aún más, entonces. – Joey

+0

De hecho ... le está pidiendo al compilador que sea realmente inteligente, con el propósito de acortar el código marginalmente. – Noldorin

+0

creo que la palabra que estamos buscando es 'ambigüedad'. hay casos en los que 'someVariable.GetType() == Animal' puede ser ambiguo. es 'Animal' en el fragmento anterior una definición de clase o miembro? si 'typeof' no se usa,' Animal' * must * debe ser miembro. si se usa 'typeof',' Animal' * debe * ser una definición de clase. –

0

typeof() me permite obtener una instancia de un objeto Type sin tener que tener una instancia del objeto de destino en la mano. Esto a su vez me permite hacer preguntas sobre la clase sin tener una instancia de la misma.

0

Bueno, ¿cómo se obtiene el System.Type de una clase sin instanciar primero la clase, si no se utiliza el typeof operatore? Simple, no se puede: D

Como puede hacer muchas reflexiones con solo un System.Type, este operador es muy útil.

3

No tener typeof tenga como consecuencia la ambigüedad:

class foo 
{ 
    public static string ToString() 
    { 
     return "Static"; 
    } 
} 
public class Program 
{ 
    private static void Main(string[] args) 
    { 
     Console.WriteLine(foo.ToString()); 
     Console.WriteLine(typeof(foo).ToString()); 
    } 
} 

foo y typeof(foo) no se refieren a la misma cosa, y forzar al compilador a fingir que son es una mala idea, incluso si ignoramos esta ambigüedad.

Cuestiones relacionadas