ToString()方法是否被编译器优化?

3
假设我有以下代码:
Console.WriteLine("Value1: " + SomeEnum.Value1.ToString() + "\r\nValue2: " + 
                    SomeOtherEnum.Value2.ToString());

编译器是否会将其优化为:

Console.WriteLine("Value1: " + SomeEnum.Value1 + "\r\nValue2: " +
                         SomeOtherEnum.Value2);

我已使用IL反汇编器进行了检查,发现调用了IL_005a: callvirt instance string [mscorlib]System.Object::ToString()

我不知道JIT是否会对此进行优化。


现在已经很晚了,我可能会漏掉一些东西,但这怎么算是优化呢? - Jon Seigel
@Jon Seigel 我尽量避免写ToString()只是为了少打几个字,但是一个朋友说这是不必要的开销,所以我在这里问一下,以消除任何疑虑。 - TheVillageIdiot
Value1 是字符串类型时,JIT编译器可以优化对 ToString 的调用。 - Steven
真是太愚蠢了,我问了这个问题。是的,@Steven,你是对的,我实际上想知道在字符串上调用ToString()的情况。哦,我的知识水平又膨胀了,哈哈哈。 - TheVillageIdiot
真正的优化发生在运行时,因为这些调用很可能被内联。 - Dykam
1个回答

3
不,恰恰相反。应该是这样的:

Console.WriteLine("Value1: " + SomeEnum.Value1 + "\r\nValue2: " +
                     SomeOtherEnum.Value2);

被编译器翻译成(等同于)以下内容:
string s = String.Concat("Value1: ", SomeEnum.Value1.ToString(), "\r\n Value2: ", SomeOtherEnum.Value2.ToString());
Console.WriteLine(s);

在这两种情况下,生成的IL代码是相同的。如果您想知道JIT是否会将其转换为:
string s = String.Concat("Value1: ", "Value1", "\r\n Value2: ", "Value2");
Console.WriteLine(s);

那么答案是否定的。不过我想知道为什么这对你是个问题?

请查看我在@Jon Seigel评论中的回复。 - TheVillageIdiot
好的,无论如何,你发布的这两行代码基本上是等价的。如果你有像ReSharper这样的工具,它实际上会在调用ToString()时通知你它是多余的。这不是因为存在任何性能损失,而是没有必要。 - Dean Harding

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接