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
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.
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.
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.
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
De hecho ... le está pidiendo al compilador que sea realmente inteligente, con el propósito de acortar el código marginalmente. – Noldorin
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. –
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.
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.
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.
- 1. ¿Por qué se necesita NotificationCompat?
- 2. `¿Por qué typeof this` "objeto" de retorno?
- 3. ¿Por qué se necesita WEXITSTATUS incluso?
- 4. ¿Por qué necesita PrintWriter?
- 5. ¿Por qué necesita codificar URL?
- 6. ¿Por qué typeof (Foo) alguna vez devolvería nulo?
- 7. ¿Para qué se necesita SynchronizationContext.IsWaitNotificationRequired?
- 8. ¿Por qué "lock (typeof (MyType))" es un problema?
- 9. ¿Por qué System.Type.GetType ("Xyz") devuelve null si typeof (Xyz) existe?
- 10. ¿Por qué falla Assert.IsInstanceOfType (0.GetType(), typeof (int))?
- 11. ¿Por qué C# no permite un typeof como parámetro predeterminado?
- 12. ¿Por qué UnderscoreJS usa toString.call() en lugar de typeof?
- 13. ¿Por qué se necesita reiniciar CruiseControl.NET después de GetCcNetConfigFiles?
- 14. ASP.NET MVC Validación no intrusiva: ¿por qué se necesita contexto?
- 15. pytz: ¿Por qué se necesita normalizar al convertir zonas horarias?
- 16. Por qué se necesita MD5 para la inicialización de JCE
- 17. ¿Por qué RSACryptoServiceProvider.VerifyHash necesita una verificación LDAP?
- 18. ¿Por qué la web necesita HTTP?
- 19. ¿Por qué removeChild necesita un nodo principal?
- 20. por qué std :: search necesita reenviar iters
- 21. ¿Por qué VARCHAR necesita especificación de longitud?
- 22. ¿Por qué esta propiedad necesita el 'retener'?
- 23. ¿Por qué ordenadoDiccionario necesita tanta sobrecarga?
- 24. ¿Qué se necesita para mcrypt_decrypt() de PHP?
- 25. ¿Qué se necesita para hacer una "compilación"?
- 26. Android ROM Development. ¿Qué se necesita?
- 27. Qué filtro de Kalman se necesita
- 28. ¿Por qué usar toString() para tipear argumentos que puede verificar con typeof?
- 29. ¿Cuándo se necesita @uncheckedVariance en Scala, y por qué se usa en GenericTraversableTemplate?
- 30. typeOf on return type
Sí, pero la pregunta es: ¿por qué? –
@Daniel Earwicker ¿por qué? para distinguir miembros estáticos y miembros de tipo. – Andrey
Ah, ya veo, me perdí esa parte de la respuesta, ¡oh! +1 –