C#匿名类型`ToString`复杂吗?

问题描述 投票:0回答:1

有人知道为什么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);
}
c# .net .net-core roslyn anonymous-types
1个回答
2
投票

这是一个反编译的源代码,它的外观肯定与原始的有所不同。当您使用ILSpy反编译代码时,您会得到实际的二进制/ IL代码,这些代码已被编译器大量修改和优化。另外,ILSpy根据变量的IL类型或变量的上下文生成变量名。如果您想了解某些mscorlib正式类型是如何实现的,则可以have a look here

© www.soinside.com 2019 - 2024. All rights reserved.