String interning?

前端 未结 6 1426
抹茶落季
抹茶落季 2020-12-09 13:15

The second ReferenceEquals call returns false. Why isn\'t the string in s4 interned? (I don\'t care about the advantages of StringBuilder over string concatenation.)

6条回答
  •  醉梦人生
    2020-12-09 13:44

    The string in s4 is interned. However, when you execute s4 += "m";, you have created a new string that will not be interned as its value is not a string literal but the result of a string concatenation operation. As a result, s3 and s4 are two different string instances in two different memory locations.

    For more information on string interning, look here, specifically at the last example. When you do String.Intern(s4), you are indeed interning the string, but you are still not performing a reference equality test between those two interned strings. The String.Intern method returns the interned string, so you would need to do this:

    string s1 = "tom";
    string s2 = "tom";
    
    Console.Write(object.ReferenceEquals(s2, s1)); //true 
    
    string s3 = "tom";
    string s4 = "to";
    s4 += "m";
    
    Console.Write(object.ReferenceEquals(s3, s4)); //false
    
    string s5 = String.Intern(s4);
    
    Console.Write(object.ReferenceEquals(s3, s5)); //true
    

提交回复
热议问题