Dot-Net

為什麼構造的委託類的呼叫方法是虛擬的?

  • January 21, 2013

我在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# 缺乏以另一種方式表達這一點的語法。

引用自:https://stackoverflow.com/questions/7588417