2013-07-05 25 views
0

我有用於訪問字段從父類像這樣一些性能:JIT是否可以從另一個類內聯私人字段訪問?

類A:B

private int _number = 42; 
public virtual int Number { get { return _number; } } 

類:A:

public override int Number { get { return base.Number + 1; } } 

我的問題是,如果我訪問B.Number,它仍然會解析爲直接訪問A._number(+ 1)?

當然,這是假設優化的發佈版本。

更重要的是,訪問修飾符是抽象的嗎(因爲它們只在編譯時很重要,並且在運行時對代碼沒有影響),還是它們實際上限制了運行時的訪問(當然,除了使用Reflection時)?

+0

特別是對於這種情況下,我不確定..但是,我知道JIT內聯自動屬性分配從同一類內(不要求我找到該參考),因爲他們只是方法調用與一條線(因此,很容易「內聯」)。但我不確定繼承如何在這種情況下發揮作用。 –

+1

鑑於該屬性仍然是虛擬的,JIT *不能*將'B.Number'訪問內聯到簡單的字段訪問。它可能會封閉它 - 但如果你真的關心它,你應該打開調試器並查看彙編代碼來檢查。它可能與x64的x86不同。 –

+0

我可以看到爲什麼會這樣,但是它不能檢測到什麼都不會覆蓋從B派生的類中的屬性並使其自動封閉該屬性?如果有人_does_覆蓋它並仍然調用'base.Number',那麼這個調用是否仍然被內聯? –

回答

0

那麼它們是抽象的,因爲它們不影響運行時性能,但是對於啓用安全管理器的情況,信息仍需要存儲在編譯的IL中。

並且不,對此處的getter函數的調用未在x64或x86中內聯。

public static void Main(string[] args) {  
    B b = new B(); 
    int a = b.Number; 
} 

您可以使用these instructions反彙編jitted代碼並親自查看。

相關問題