Dot-Net
為什麼構造的委託類的呼叫方法是虛擬的?
我在CLR 中通過 C#和 codeproject 文章Delegate behind the Scenes中看到,當 C# 編譯器看到這個時
public delegate void MyDelegate(int intValue);它實際上會產生這樣的東西
class MyDelegate : System.MulticastDelegate { public virtual void Invoke(Int32 intValue); ... }問題是,為什麼 Invoke 方法是虛擬的?這個生成的委託類型可以被繼承嗎?從CLR的角度看起來是可以的。但為什麼?為什麼不生成密封類,這樣在執行時就不會有虛方法查找懲罰?
這就像鴨子一樣的嘎嘎打字。使 System.Int32(一種值類型)派生自 ValueType(一種引用類型)的類似類型。沒有意義,在 C# 中是非法的,但實際上是這樣的。委託的 Invoke 方法的真正實現隱藏在 CLR 中,並且是用 C++ 編寫的靜態函式。
但可以肯定的是,將其註釋為虛擬是有一定意義的,因為它的行為類似於虛擬方法。執行的實際程式碼不像使用非虛擬類方法那樣固定。更難推理的是,對於綁定到靜態方法的委託,正確的模型應該是什麼。一個靜態的虛擬方法?
它只是一隻虛擬鴨子。
閱讀 C 中使用的函式指針可以幫助您獲得更好的委託心智模型。委託是一個帶有鈴鐺的函式指針,它也可以儲存目標對象。C# 缺乏以另一種方式表達這一點的語法。