public static void Main()
Console.WriteLine("".PadRight(100, '*'));
Console.WriteLine("Compiler interns constant literals (therefore s1 and s2 will be the same instance)");
Console.WriteLine("".PadRight(100, '*'));
Console.WriteLine("s1 = " + s1);
Console.WriteLine("s2 = " + s2);
Console.WriteLine("s1 is interned: " + (string.IsInterned(s1) != null));
Console.WriteLine("s2 is interned: " + (string.IsInterned(s2) != null));
Console.WriteLine("s1 is equal to s2: " + string.Equals(s1, s2));
Console.WriteLine("s1 is equal reference to s2: " + object.ReferenceEquals(s1, s2));
Console.WriteLine("".PadRight(100, '*'));
Console.WriteLine("Concatenating 'd' to both strings, without interning 'abcd', will create 2 different instances");
Console.WriteLine("".PadRight(100, '*'));
Console.WriteLine("s1 = " + s1);
Console.WriteLine("s1 is interned: " + (string.IsInterned(s1) != null));
Console.WriteLine("s2 = " + s2);
Console.WriteLine("s2 is interned: " + (string.IsInterned(s2) != null));
Console.WriteLine("s1 == s2: " + string.Equals(s1, s2));
Console.WriteLine("s1 === s2: " + object.ReferenceEquals(s1, s2));
Console.WriteLine("".PadRight(100, '*'));
Console.WriteLine("Interning 'abcd' (s1) and creating new strings, will reuse the interned instance");
Console.WriteLine("".PadRight(100, '*'));
Console.WriteLine("s3 = " + s3);
Console.WriteLine("s4 = " + s4);
Console.WriteLine("s1 is interned: " + (string.IsInterned(s1) != null));
Console.WriteLine("s2 is interned: " + (string.IsInterned(s2) != null));
Console.WriteLine("s3 is interned: " + (string.IsInterned(s3) != null));
Console.WriteLine("s4 is interned: " + (string.IsInterned(s4) != null));
Console.WriteLine("s1 == s3: " + string.Equals(s1, s3));
Console.WriteLine("s1 === s3: " + object.ReferenceEquals(s1, s3));
Console.WriteLine("s1 == s4: " + string.Equals(s1, s4));
Console.WriteLine("s1 === s4: " + object.ReferenceEquals(s1, s4));
Console.WriteLine("s2 == s3: " + string.Equals(s2, s3));
Console.WriteLine("s2 === s3: " + object.ReferenceEquals(s2, s3));
Console.WriteLine("s2 == s4: " + string.Equals(s2, s4));
Console.WriteLine("s2 === s4: " + object.ReferenceEquals(s2, s4));
Console.WriteLine("s3 == s4: " + string.Equals(s3, s4));
Console.WriteLine("s3 === s4 " + object.ReferenceEquals(s3, s4));