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 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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With