CompilationRelaxations.NoStringInterning如何实际工作?
[assembly: System.Runtime.CompilerServices.CompilationRelaxations(System.Runtime.CompilerServices.CompilationRelaxations.NoStringInterning)]
class Program
{
static void Main(string[] args)
{
String s1 = "Friday";
String s2 = "Friday";
String s3 = "Friday";
String s4 = "Friday";
String s5 = "Friday";
String s6 = "Friday";
String s7 = "Friday";
String s8 = "Friday";
String s9 = "Friday";
// etc...
Console.WriteLine(Object.ReferenceEquals(s1, s2));
Console.WriteLine(Object.ReferenceEquals(s1, s3));
Console.WriteLine(Object.ReferenceEquals(s1, s4));
Console.WriteLine(Object.ReferenceEquals(s1, s5));
Console.WriteLine(Object.ReferenceEquals(s1, s6));
Console.WriteLine(Object.ReferenceEquals(s1, s7));
Console.WriteLine(Object.ReferenceEquals(s1, s8));
Console.WriteLine(Object.ReferenceEquals(s1, s9));
// etc...
我有问题,我试着用.NET CLR 2,3,4 ..作为输出我得到的是一堆真。我期待着一大堆假!
驱动程序,如果我在编译后查看IL DASM,我会看到一堆带有ldstr“Friday”的行。你写“不妨碍编译器进行字符串实习”这与编译器有什么关系?如果编译器正在进行实习,那么该方法中不应只有一个“周五”?为什么我不得不付出加载这个常数一堆的价格,并让运行时间来清理重复项?我很困惑... – Mishax 2013-03-24 20:58:24
我不认为ILDASM给你这里的完整故事。这个字符串可能只在#US堆中存在一次,并且CLR在#US堆中每个字符串实例化一个字符串对象(而不是每个唯一字符序列中的一个,而普通字符串实际存在)。由于ILDASM将#US堆引用替换为实际的字符串文字,我认为您需要使用一些较低级别的工具来查看实际存在的内容。 – poizan42 2015-07-23 14:56:45