ToString方法并返回静态字符串 - c#

类的例子:

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#5规范的2.4.4.5节:

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

因此,作为一个简单的示例:

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

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

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

当回复有时是一个对象有时是一个数组时,如何在使用改造时解析JSON回复? - java

我正在使用Retrofit来获取JSON答复。这是我实施的一部分-@GET("/api/report/list") Observable<Bills> listBill(@Query("employee_id") String employeeID); 而条例草案类是-public static class…

改造正在返回一个空的响应主体 - java

我正在尝试使用Retrofit和Gson解析一些JSON。但是,我得到的响应机构是空的。当我尝试从对象中打印信息时,出现NullPointerException。我确保URL正确,并且我也确保POJO也正确。我正在使用jsonschema2pojo来帮助创建POJO类。这是我要解析的JSON{ "?xml": { "@versi…

Mongo汇总 - javascript

我的收藏中有以下文件{ "_id": ObjectId("54490b8104f7142f22ecc97f"), "title": "Sample1", "slug": "samplenews", "cat": …

在Map中,如果我们使用现有键进行修改,则不会获得ConcurrentModificationException - java

我有以下代码,我希望从情况2的情况下抛出ConcurrentModificationException,但它运行成功。据我所知,如果我对地图中的单个键执行相同的操作,则不会抛出异常,因为here但是当我重现这种具有两个案例的多个密钥的场景时,通过新密钥修改。通过现有密钥进行修改。情况1: Map<String,String> mp = new H…

不会将toString()方法中的super关键字隐式转换为super.toString() - java

我有以下两个类,如下所示。为了简单起见,仅显示toString重写的方法。 public class Circle { @Override public String toString() { return "Circle"; } } public class Cylinder extends Circle { @Override pub…