2016-01-04 60 views
6

我四處張望了一下,但一直沒能找到一個答案,新的C#6.0編譯如何分解爲一些新的空傳播命令,如下所示:空傳播運營商

BaseType myObj = new DerivedType(); 
string myString = (myObj as DerivedType)?.DerivedSpecificProperty; 

我想知道的是它如何處理這個問題。

它是否會將as演員組緩存到新的DerivedType變量中(即,這只是as演員後面跟着空比較的語法糖)。

或者如果它實際上as強制轉換,請檢查null,然後如果不是null,重鑄並繼續。

回答

8

是否緩存as澆鑄成一個新的變量DerivedType(即,這是用於as鑄造之後是空的比較只是語法糖)。

是。

您的代碼將被編譯成這樣的:

BaseType myObj = new DerivedType(); 
DerivedType temp = myObj as DerivedType; 
string myString = temp != null ? temp.DerivedSpecificProperty : null; 

你可以看到,this TryRoslyn example(雖然,因爲HVD評論說,通過觀察IL你可以看到有實際上不是DerivedType變量這個引用只是簡單的存儲在堆棧中)。

+0

那麼,沒有。如果關閉C#反編譯模式並只檢查IL生成的內容,就會發現它不使用變量,它只是使用'dup'來複制堆棧中的值。 – hvd

+0

@ hvd這是因爲IL中唯一內置的引用類型是對象和字符串。 – phoog

+0

@phoog我完全不知道你說的是什麼意思。 – hvd