0

我很好奇 C# 编译器将如何处理以下两个语句:

String text = "abcdefghijklmnopqrstuvwxyz";
text = text.Substring( 0, 15 );
text = text + "...";

对比

String text = "abcdefghijklmnopqrstuvwxyz";
text = text.Substring( 0, 15 ) + "...";

结果当然是一样的,但是连接运算符在第二个设置中是否更好地优化了代码?

在这两种情况下,您最终会为堆栈上的字符串分配 4 次,还是第二种情况只分配 3 次?

只是我在阅读一些代码时遇到的一个随机问题。

4

2 回答 2

10

首先,字符串首先没有分配在堆栈上。字符串在堆上。

其次,在这两种情况下都有四个分配。我很好奇你认为哪一个可能会消失。

巧合的是,这是我本周博客的主题。有关此主题的更多信息,请参阅这篇文章。

于 2013-06-26T14:11:06.697 回答
2

我把你的代码编译成一个简单的控制台应用程序。然后,我检查了 IL(使用 ILSpy)。在调试或发布模式下均未进行任何优化。

在这种情况下,代码可能足够简单以至于编译器没有进行任何优化。但是,更复杂的版本可能会产生不同的结果。

另外,请注意,这两个示例之间几乎没有区别。在这两种情况下,运行时最终都会生成四个不同的字符串对象。在第一个示例中,对变量的赋值只进行了两次,而在第二个示例中,赋值进行了三次。但是,无论如何都会创建四个字符串。它们如下:

  • “abcdefghijklmnopqrstuvwxyz”
  • “abcdefghijklmno”(来自子字符串)
  • “……”
  • “abcdefghijklmno...”(来自串联)

在这两种情况下,前三个字符串几乎可以立即进行垃圾收集。我猜编译器没有看到任何重要的方法来改进你所拥有的。

于 2013-06-26T14:15:49.367 回答