And another: Literal strings (strings declared in source code) are by default interned into a pool to save memory.
string s1 = "MyTest";
string s2 = new StringBuilder().Append("My").Append("Test").ToString();
string s3 = String.Intern(s2);
Console.WriteLine((Object)s2==(Object)s1); // Different references.
Console.WriteLine((Object)s3==(Object)s1); // The same reference.
Although it saves memory when the same literal string is used multiple times, it costs some cpu to maintaining the pool and once a string is put into the pool it stays there until the process is stopped.
Using CompilationRelaxationsAttribute you can tell the JIT compiler that you really don't want it to intern all the literal strings.
[assembly: CompilationRelaxations(CompilationRelaxations.NoStringInterning)]