在this回答最快的方式来确定属性是否包含给定的属性的问题,用户Darin Dimitrov假定表达式树比反射更安全。这是真的吗?如果是这样,为什么这是真的?表达式树为什么比反射更安全?
14
A
回答
13
因为当你搜索你的领域(如在那个问题中)你使用字符串表示"Id"
。一旦它被改变,你的反射就会崩溃。
达林暗示什么是静态类型:
Expression<Func<Program, int>> expression = p => p.Id;
你看到了吗?这很有趣,但不是C#4.0编译器的众所周知的特性:从lambda表达式自动构建表达式树并将其转换为Expression<T>
。所以后来你可以遍历它并得到的Id
。但它不如Reflection的普遍性,因为您无法通过string
进行搜索。
1
从我对.NET的有限知识中,表达式树似乎可以进行类型检查。
5
这个问题就是为什么表达树比反射更安全。
答案是他们是都使用反射。
编辑澄清 - MemberInfo.GetCustomAttributes是一个反射调用。
http://msdn.microsoft.com/en-us/library/system.reflection.memberinfo.getcustomattributes(VS.71).aspx
0
如果我们谈论的是类型安全和代码重新命名,例如属性时打破,表达式树“优势”,现在否定,我们有新的C#的功能,如nameof():
表达树路(是nameof以前好()):从名字
Expression<Func<YourClass, int>> expression = p => p.Id;
var memberExpression = (MemberExpression)expression.Body;
var property = ((PropertyInfo)memberExpression.Member);
的getProperty(是坏之前nameof()):
var property = typeof(YourClass).GetProperty(nameof(YourClass.Id));
GetProperty中的字符串输入并不安全,因为它被硬编码为“Id”,并且当您重命名Id属性时,如果您不记得替换此字符串,则代码将在运行时中断。
这使表达式树更安全,因为您使用了属性的实际名称。我们有nameof(),所使用的字符串实际上是编译时的属性名称,如果您重命名属性,并且您/您的IDE“忘记”在上面的代码片段中重命名它,并且,代码将在编译时中断。
所以现在旧的“坏道”在我看来更加简洁,可能会表现得更好,因为你不需要额外的铸造。
相关问题
- 1. 为什么Rabin Cryptosystem比RSA更安全?
- 2. 反射安全吗?
- 3. 用lambda表达式反射
- 4. 为什么Enum认为比常量更安全?
- 5. 使正则表达式更安全
- 6. 为什么在.NET中投射速度比反射速度快?
- 7. 为什么认为加密更安全?
- 8. 为什么复制{ctrl down} c {ctrl up}比^ c更安全?
- 9. 为什么引用变量类型比指针更安全?
- 10. 为什么Docker的秘密比环境变量更安全?
- 11. 为什么参考比指针更安全?
- 12. 正则表达式安全
- 13. lambda表达式序列化中的安全风险是什么?
- 14. 为什么avl树比红黑树搜索更快?
- 15. 获取属性值的表达式不需要比反射更快吗?
- 16. 表达式树,对象比较器
- 17. Linq表达式树字符串比较
- 18. lambda表达式反射与正常反射
- 19. C#反射树
- 20. 表达式树
- 21. 为什么从C#调用Python lambda表达式不是线程安全的?
- 22. 为什么正则表达式称为“常规”表达式?
- 23. 为什么PHP中的投射和比较比is_ *更快?
- 24. 为什么这个ruby代码比较正则表达式?
- 25. 为什么用表达式<TDelegate> .Compile()比纯C#慢?
- 26. 为什么这个正则表达式抑制比我更期待?
- 27. 如何反思T为查询构建表达式树?
- 28. 表达式树的ReadLine的最佳方式是什么?
- 29. vsnprintf为什么安全?
- 30. __caller__为什么不安全?
它自动重构工具效果更好,因为他们知道它引用了某个属性并且不是不透明的字符串。 – CodesInChaos 2010-11-11 20:46:14
速度有什么不同吗? – hkon 2010-11-11 20:49:23
@hkon一些。你不必搜索'MemberInfo' – Andrey 2010-11-11 20:50:02