2013-04-03 189 views
0

我在.net 4.5中有一個簡單的控制檯應用程序。CompilationRelaxations屬性不起作用

 
public class Program 
{ 
    public static void Main() 
    { 
     string s1 = "s1"; 
     string s2 = "s1"; 

     Console.WriteLine(ReferenceEquals(s1, s2)); 
    } 
} 

這讓因爲字符串實習也是如此。但是,當我將CompilationRelaxations屬性添加到AssemblyInfo文件時,我仍然將它看作是輸出。

[裝配:CompilationRelaxations(CompilationRelaxations.NoStringInterning)

即使添加屬性到我的計劃類似乎並沒有改變輸出。 [CompilationRelaxations(CompilationRelaxations.NoStringInterning)]

將其更改爲.net 4.0應用程序也沒有任何效果。

我錯過了什麼?

+2

這是一個純粹的猜測,但是在實習生有機會在運行時做它的事情之前,編譯器會爲你優化兩個字符串常量。嘗試在一個單獨的文件中添加一個單獨的類,併爲其創建一個函數'public static string s1(){return「s1」;}'。然後從'main'調用該函數,並將結果與​​''main「'中定義的'」s1「'常量進行比較。我的猜測是,只有在打開實習計劃的情況下,這個比例纔會相等。 – dasblinkenlight

+0

@dasblinkenlight:我不這麼認爲。添加'[MethodImpl(MethodImplOptions.NoOptimization)]'沒有幫助。 –

回答

1

下面是從documentation報價:

標記的組件爲不需要字串文本實習。

它不會阻止編譯器進行字符串實習,只是提供一個不需要的提示。 MSDN和CLI規範中的文檔都很差。另請參閱此MSDN forum post