有人知道为什么C#中的匿名类型对ToString
使用如此复杂的实现吗?我相信早期版本使用的是更简单的StringBuilder
实现。
这里是ILSpy的样本ToString
:
public override string ToString() {
object[] array = new object[2];
<a>j__TPar val = <a>i__Field;
ref <a>j__TPar reference = ref val;
<a>j__TPar val2 = default(<a>j__TPar);
object obj;
if (val2 == null) {
val2 = reference;
reference = ref val2;
if (val2 == null) {
obj = null;
goto IL_0046;
}
}
obj = reference.ToString();
goto IL_0046;
IL_0046:
array[0] = obj;
<b>j__TPar val3 = <b>i__Field;
ref <b>j__TPar reference2 = ref val3;
<b>j__TPar val4 = default(<b>j__TPar);
object obj2;
if (val4 == null) {
val4 = reference2;
reference2 = ref val4;
if (val4 == null) {
obj2 = null;
goto IL_0081;
}
}
obj2 = reference2.ToString();
goto IL_0081;
IL_0081:
array[1] = obj2;
return string.Format(null, "{{ a = {0}, b = {1} }}", array);
}
这是一个反编译的源代码,它的外观肯定与原始的有所不同。当您使用ILSpy反编译代码时,您会得到实际的二进制/ IL代码,这些代码已被编译器大量修改和优化。另外,ILSpy根据变量的IL类型或变量的上下文生成变量名。如果您想了解某些mscorlib正式类型是如何实现的,则可以have a look here。