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.)
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
When I do String.Intern(s4);, I still get false.
Here, both s3 and s4 are interned but their references are not equal?
string s3 = "tom";
string s4 = "to";
s4 += "m";
String.Intern(s4);
Console.WriteLine(s3 == s4); //true
Console.WriteLine(object.ReferenceEquals(s3, s4)); //false
Console.WriteLine(string.IsInterned(s3) != null); //true (s3 is interned)
Console.WriteLine(string.IsInterned(s4) != null); //true (s4 is interned)
The string in
s4is interned. However, when you executes4 += "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,s3ands4are 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. TheString.Internmethod returns the interned string, so you would need to do this: