En this a la pregunta de la forma más rápida de determinar si una propiedad contiene un atributo dado, el usuario Darin Dimitrov postuló que los árboles de expresión son más seguros que la reflexión. ¿Es esto cierto, y si es así, por qué es cierto?¿Por qué los árboles de expresión son más seguros que la reflexión?
Respuesta
Porque cuando busca su campo (como en esa pregunta) usa la representación de cadena "Id"
. Una vez que se haya cambiado, tu reflejo se colapsará.
Lo que sugiere es Darin tipos estáticos:
Expression<Func<Program, int>> expression = p => p.Id;
Ves eso? Esta es una característica interesante, pero no muy conocida, del compilador C# 4.0: automáticamente crea el árbol de expresiones a partir de la expresión lambda y lo convierte al Expression<T>
. Entonces, más tarde puede atravesarlo y obtener MemberInfo
de Id
. Pero no es tan universal como Reflection porque no puede buscar por string
.
De mi conocimiento limitado de .NET, la forma de árbol de expresión parece hacer la verificación de tipo.
La pregunta que se plantea es por qué los árboles de expresión son más seguros que la reflexión.
La respuesta es que son ambos utilizando la reflexión.
Editar para aclarar: MemberInfo.GetCustomAttributes es una llamada de reflexión.
http://msdn.microsoft.com/en-us/library/system.reflection.memberinfo.getcustomattributes(VS.71).aspx
Hay alguna diferencia en seguridad, por lo que está equivocado. – Andrey
Llegar al punto para llamar a la reflexión es tipear seguro, y es un buen truco. Sin embargo, el resultado final en ambos casos es una llamada de reflexión a System.Reflection.MemberInfo.GetCustomAttributes – asawyer
. La pregunta es cómo son diferentes, no cómo son similares. – Andrey
Si estamos hablando de la seguridad de tipos y romper el código al cambiar el nombre propiedades, por ejemplo, el árbol de expresión "ventaja" es negado ahora que tenemos nuevas características de C# como nombredel():
de expresión manera de árbol (era mejor antes nombredel()):
Expression<Func<YourClass, int>> expression = p => p.Id;
var memberExpression = (MemberExpression)expression.Body;
var property = ((PropertyInfo)memberExpression.Member);
GetProperty de nombre (antes era malo nombredel()):
var property = typeof(YourClass).GetProperty(nameof(YourClass.Id));
La entrada de cadena en GetProperty no era segura, ya que estaba codificada como "Id", y cuando renombró la propiedad Id, su código se rompería en tiempo de ejecución si no recordaba reemplazar también esta cadena.
Eso hizo que los árboles de expresión sean más seguros, porque usaste el nombre real de la propiedad.
Pero ahora que tenemos nameof(), la cadena utilizada es en realidad el nombre de la propiedad en tiempo de compilación, y si cambia el nombre de la propiedad, y usted/su IDE "olvida" cambiarle el nombre en el fragmento anterior también , el código se romperá en el tiempo de compilación.
Así que ahora el viejo "mal camino" es más conciso en mi opinión y probablemente también rinda un poco mejor, ya que no necesita el casting extra.
- 1. ¿Qué son los árboles de expresión, cómo los usa y por qué los usaría?
- 2. ¿Los árboles de expresión LINQ son árboles apropiados?
- 3. ¿Por qué son importantes los árboles binarios?
- 4. ¿Por qué los EJB son seguros y los servlets no?
- 5. ¿Los miembros privados son realmente más "seguros" en Java?
- 6. ¿Por qué los servlets no son seguros para subprocesos?
- 7. ¿Por qué los objetos inmutables son seguros para subprocesos?
- 8. Por qué los subprocesos POSIX son más lentos que OpenMP
- 9. Construyendo árboles de expresión
- 10. ¿Qué tan seguros son los recursos en .NET?
- 11. ¿Por qué los árboles de búsqueda binaria?
- 12. ¿Cuáles son algunos ejemplos en los que los árboles de expresiones son útiles?
- 13. Convertir árboles de expresión
- 14. ¿Cómo saber qué archivos cree que IE son "no seguros"?
- 15. ¿Son seguros los subprocesos urllib2 y httplib?
- 16. ¿Estos hilos son seguros?
- 17. ¿Por qué los argumentos de expresión lambda son ambiguos entre Func y Expresión <Func>?
- 18. ¿Quizás la mónada usa árboles de expresión?
- 19. ¿Por qué los programas de estilo rápido son más cortos que los programas de estilo defensivo?
- 20. ¿Por qué los desarrolladores de PHP son más baratos que los desarrolladores de .NET?
- 21. Unidad de árboles de expresión Pruebas
- 22. ¿Por qué los archivos compilados de clase Java son más pequeños que los compilados en C?
- 23. Uso práctico de árboles de expresión
- 24. ¿Qué caracteres no son seguros en las cadenas de consulta?
- 25. ¿Por qué los tipos sellados son más rápidos?
- 26. Determinar qué bloqueos son los más disputados?
- 27. ¿Qué son los modelos para almacenar estructuras de árboles y cuáles son sus características?
- 28. ¿Los comentarios son 100% seguros en todos los entornos principales?
- 29. ¿Están terminados los árboles de expresión de LINQ Turing?
- 30. el enlace de parámetros en los árboles de expresión
Y funciona mejor con herramientas de refactorización automáticas ya que saben que se refiere a una propiedad determinada y no es una cadena opaca. – CodesInChaos
¿Hay alguna diferencia en la velocidad? – hkon
@hkon algunos. no tiene que buscar 'MemberInfo' – Andrey