相关疑难解决方法(0)

为什么默认情况下只有文本字符串保存在实习池中?

为什么默认情况下只有文字字符串保存在实习池中?

来自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)

.net c# compiler-construction string clr

29
推荐指数
2
解决办法
5422
查看次数

CompilationRelaxations.NoStringInterning实际上如何工作?

我在演示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.我期待一堆虚假!

c# string-interning

4
推荐指数
2
解决办法
1281
查看次数

如果我内联 HashSet 集合初始化,编译器是否知道只执行一次?

我经常这样做...

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)

那么确实,当然它只在类实例化时完成一次。(或者,也许在编译时/启动时?但无论如何,只有一次。)

c# collections static-initialization language-lawyer

3
推荐指数
1
解决办法
6445
查看次数