【发布时间】:2009-06-17 20:35:52
【问题描述】:
我刚刚遇到了一些对我来说很奇怪的事情:当你对一个值类型使用 Equals() 方法时(当然,如果这个方法没有被覆盖)你会得到一些东西非常非常慢 - 使用反射对字段进行一对一的比较!如:
public struct MyStruct{
int i;
}
(...)
MyStruct s, t;
s.i = 0;
t.i = 1;
if ( s.Equals( t )) /* s.i will be compared to t.i via reflection here. */
(...)
我的问题:为什么 C# 编译器不生成一个简单的方法来比较值类型?类似于(在 MyStruct 的定义中):
public override bool Equals( Object o ){
if ( this.i == o.i )
return true;
else
return false;
}
编译器在编译时就知道 MyStruct 的字段是什么,为什么要等到运行时才枚举 MyStruct 的字段?
对我来说很奇怪。
谢谢:)
添加:抱歉,我才意识到Equals 当然不是语言关键字而是运行时方法……编译器完全不知道这种方法。所以在这里使用反射是有意义的。
【问题讨论】:
-
"要使用 Equals 的标准实现,您的值类型必须装箱并作为引用类型 System.ValueType 的实例传递。然后 Equals 方法使用反射来执行比较。" - msdn.microsoft.com/en-us/library/ff647790.aspx
标签: c# compiler-construction struct