如图所示 这里,创建在运行时不能被拘留的字符串。
但是,以下代码:
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)
请参阅工作示例。
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)方法。