字符串上的 ReferenceEquals

kus*_*szi 2 c# string mono

如图所示 这里,创建在运行时不能被拘留的字符串。

但是,以下代码:

    class Program {
    static void Main(string[] args)
    {
        string s1 = "Programming Is Fun";
        string s3 = s1.ToString();
        Console.WriteLine(Object.ReferenceEquals(s1, s3));
    }
}
Run Code Online (Sandbox Code Playgroud)

给出(VS 2015):

True
Run Code Online (Sandbox Code Playgroud)

那么,它是否以某种方式指定了在运行时生成哪些字符串?

顺便提一句:

编码:

using System;
using System.Text;

class Program {
  static void Main(string[] args)
  {
    string s1 = "hop";
    StringBuilder s2 = new StringBuilder(s1);
    string s3 = s2.ToString();
    Console.WriteLine(Object.ReferenceEquals(s1, s3));
  }
}
Run Code Online (Sandbox Code Playgroud)

给出(VS 2015):

False
Run Code Online (Sandbox Code Playgroud)

与单声道(版本 4.0.2)相反,它给出

True
Run Code Online (Sandbox Code Playgroud)

请参阅工作示例

Jak*_*rtz 5

String.ToString() 返回对相同字符串的引用:

public override String ToString() {
    Contract.Ensures(Contract.Result<String>() != null);
    Contract.EndContractBlock();
    return this;
}
Run Code Online (Sandbox Code Playgroud)

在运行时创建的字符串可以被实习。引用您提到的MSDN 文章

运行时不保证在运行时创建的字符串是实习的

实习是一项昂贵的操作,通常在运行时执行它太昂贵了。如果你想确保你的字符串被实习,你可以使用public static String Intern(String str)方法。