【问题标题】:ToString method and return static stringToString 方法并返回静态字符串
【发布时间】:2013-01-01 20:01:04
【问题描述】:

类示例:

public class SomeType
{
    private int type;

    // some code...

    public override string ToString ()
    {
       if (type == 1) return "One";
       if (type == 2) return "Two";
    }
}

现在想象一下应用程序在一秒钟内调用数千次ToString() 方法。

我的问题是:当我在 something = myClass.ToString() 之类的代码中使用内联创建的字符串时,是在每次调用中创建一个新字符串还是编译器以某种方式对其进行优化? (因为字符串是不可变的,所以只能返回对静态字符串的引用)。

如果没有,出于性能原因,我是否应该制作静态私有字符串字段并在ToString 方法中返回它们?

当然我会使用秒表来测试它,但无论如何我需要一个专家的答案。

【问题讨论】:

标签: c# string tostring


【解决方案1】:

您正在使用字符串文字 - 这意味着您每次都返回对同一字符串的引用。这是语言规范保证的。来自 C# 5 规范的第 2.4.4.5 节:

当根据字符串相等运算符(第 7.10.7 节)等效的两个或多个字符串文字出现在同一程序中时,这些字符串文字引用相同的字符串实例。

所以作为一个更简单的例子:

string x = "One";
string y = "One";
Console.WriteLine(object.ReferenceEquals(x, y)); // Prints True

在您的代码中,ToString() 方法仍将被调用 - 但它不会每次都创建一个新的字符串对象。顺便说一下,您可以考虑使用switch 语句来代替所有那些if 语句。

请注意,即使它确实 每次都创建一个新字符串,但每秒创建 数千个 字符串也不会让现代 CPU 出汗。分配器和垃圾收集器都非常高效,现代计算机可以在一秒钟内完成大量工作。

【讨论】:

  • 我不明白你在说什么。你能详细说明一下吗?
  • @JABFreeware:我添加了更多细节。如果您仍然不清楚,请准确解释不清楚的地方。
  • 就像我想的那样。感谢 Skeet 先生的快速回答。
猜你喜欢
  • 2013-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-12
  • 2016-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多