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