2012-04-11 45 views
6

因爲我們都知道字符串被隱式實例化,這意味着我們不必使用new來獲取對象的引用。ldstr是否內部實現newobj?

因爲這一點,一直是我的信念,即框架照顧這一點,因此,如果我做了這樣的事情,我會得到相同的IL:

String first = new String(new char[] {'a'}); 
string second = "a"; 

但是它看來,第一行是使用newobj instance void [mscorlib]System.String::.ctor(char[]) 和第二個ldstr "a"完成。

因此,爲了獲得一個字符串參考,ldstr在內部調用newobj,我在哪裏可以看到規範/細節來支持?

回答

8

ldstr爲您提供的字面字符串爲per the documentation(記住字面字符串是默認實現的,所以它們只創建一次)。第一條語句按預期使用newobj指令創建string的常規實例。

+0

Thanks @Brian,我不知道文檔在哪裏! – 2012-04-11 18:09:31

1

string簡單地遵循參考對象類型THA基本方針,這就是爲什麼在new 你看到newobj

逸岸,如果你嘗試寫這樣的事情,也不會產生newobj

int a = new int(); 
a = 2; 
Console.WriteLine(a); 

產生的IL將

IL_0000: ldc.i4.0  
IL_0001: stloc.0  
IL_0002: ldc.i4.2  
IL_0003: stloc.0  
IL_0004: ldloc.0  
IL_0005: call  System.Console.WriteLine 

如果你寫的只是

int a = 2; 
Console.WriteLine(a); 

結果IL將爲

IL_0000: ldc.i4.2  
IL_0001: stloc.0  
IL_0002: ldloc.0  
IL_0003: call  System.Console.WriteLine 

從分配的角度來看沒有什麼區別(自然會有錯過的行),因爲我們正在談論值類型。

+0

是的。誰說它顯示?我表明,在值類型上解除相同的操作不會注入該指令。 – Tigran 2012-04-11 18:11:38

+0

@BrianRasmussen:編輯答案使其更清晰。 – Tigran 2012-04-11 18:12:50

+0

對不起,我誤解了你的觀點。 – 2012-04-11 18:13:14