2016-08-17 83 views
0

我發現一個類型的方法表包含: (1)在該類型中新定義的方法。 (2)在其基本類型中定義的虛擬方法。爲什麼方法表只包含基類的虛方法?

我完全可以理解,對於其他語言(例如C++)中的虛擬表格,只有虛擬方法需要存儲在表格中。但是對於C#,由於方法表並不完全等於虛擬表,因爲在該類型的方法表中存在在類型中新定義的非虛方法。因此我想知道爲什麼C#中的方法表是這樣設計的?爲什麼非虛擬基類型的方法不存儲,而類型本身的類型存儲。

感謝。

+0

它有什麼問題嗎?爲什麼你想要在表中使用非虛擬方法?爲了什麼?問題不是學術問題(例如,來自實施他的'C#'編譯器的人)或無意義的問題(例如,一個人問「爲什麼?」,因爲他可以)。 – Sinatr

+3

因爲它們已經存在於基類方法表中,所以不需要重複它們。雖然CLR可以自己解決這個問題,但很少需要編譯器已經發出對基類方法的調用。但當然它不能用於虛擬方法。方法綁定是一個很大的故事,特別是接口實現方法綁定的方式非常複雜。懷疑有人會寫這本手冊。 –

回答

-1

因爲vtable用於虛擬方法。非虛擬方法可以靜態解析,因此不需要查找表。

+2

方法表!= vtable,它當然包含.NET中的非虛擬方法。 –

相關問題