类示例:
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
方法返回它们?
当然我会用秒表测试它,但无论如何我需要专家的答案。
答案 0 :(得分:6)
您正在使用字符串文字 - 这意味着您每次都会返回对同一字符串的引用。这是语言规范的保证。从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破裂。分配器和垃圾收集器都非常高效,现代计算机可以在一秒钟内完成大量工作。