为什么默认情况下只有文字字符串保存在实习池中?
来自MSDN的示例:
String s1 = "MyTest";
String s2 = new StringBuilder().Append("My").Append("Test").ToString();
String s3 = String.Intern(s2);
Console.WriteLine("s1 == '{0}'", s1);
Console.WriteLine("s2 == '{0}'", s2);
Console.WriteLine("s3 == '{0}'", s3);
Console.WriteLine("Is s2 the same reference as s1?: {0}", (Object)s2==(Object)s1);
Console.WriteLine("Is s3 the same reference as s1?: {0}", (Object)s3==(Object)s1);
/*
This example produces the following results:
s1 == 'MyTest'
s2 == 'MyTest'
s3 == 'MyTest'
Is s2 the same reference as s1?: False
Is s3 the same reference as s1?: True
*/
Run Code Online (Sandbox Code Playgroud) 我在演示NoStringInterning时遇到了问题
[assembly: System.Runtime.CompilerServices.CompilationRelaxations(System.Runtime.CompilerServices.CompilationRelaxations.NoStringInterning)]
class Program
{
static void Main(string[] args)
{
String s1 = "Friday";
String s2 = "Friday";
String s3 = "Friday";
String s4 = "Friday";
String s5 = "Friday";
String s6 = "Friday";
String s7 = "Friday";
String s8 = "Friday";
String s9 = "Friday";
// etc...
Console.WriteLine(Object.ReferenceEquals(s1, s2));
Console.WriteLine(Object.ReferenceEquals(s1, s3));
Console.WriteLine(Object.ReferenceEquals(s1, s4));
Console.WriteLine(Object.ReferenceEquals(s1, s5));
Console.WriteLine(Object.ReferenceEquals(s1, s6));
Console.WriteLine(Object.ReferenceEquals(s1, s7));
Console.WriteLine(Object.ReferenceEquals(s1, s8));
Console.WriteLine(Object.ReferenceEquals(s1, s9));
// etc...
Run Code Online (Sandbox Code Playgroud)
我已尝试使用.NET CLR 2,3,4 ..作为输出,我得到的是一堆True.我期待一堆虚假!
我经常这样做...
private void Check()
{
string s = "blah";
if ( new HashSet<string>{"Joe","Eddie","Buckethead"}.Contains(s) )
Debug.Log("Guitarist.");
}
Run Code Online (Sandbox Code Playgroud)
在管道中,HashSet实际上是否只创建一次(在启动时?编译时?)然后每次都使用?
顺便说一句,我假设如果你这样做:
private HashSet<string> g = new HashSet<string>()
{"Joe","Eddie","Buckethead"};
private void Check()
{
string s = "blah";
if ( g.Contains(s) )
Debug.Log("Guitarist.");
}
Run Code Online (Sandbox Code Playgroud)
那么确实,当然它只在类实例化时完成一次。(或者,也许在编译时/启动时?但无论如何,只有一次。)