2012-12-31 12 views
2

說,我有一個委託如何委託知道哪些功能在多個用戶的情況下調用

public delegate void StringLogging(string msg); 

現在A級使用該委託提供其自己的實現,也Class B提供它自己的實現。 StringLogging委託的調用列表包含兩個相同的方法,即,一個用於Class A,一個用於B級如何做一個委託知道哪些功能屬於一類,哪一個屬於B類

回答

4

這是用C#仔細隱藏的。但是一個委託構造函數需要參數兩個參數,一個對象和一個方法組引用。在C++/CLI語言中看起來要容易得多,它沒有相同的語法糖。例如,訂閱Click事件的按鈕看起來是這樣的:

this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click); 

注意的第一個參數,實現Button1_Click的方法的對象的對象引用。委託類型不會對該對象引用做任何特殊的處理,它只是存儲它。基礎字段是Delegate.Target。稍後在調用委託時使用它,以便生成實例方法所需的也是隱藏的此參考。

C#語言不允許使用相同的語法,因此編譯器會從您在構造函數中傳遞的方法組引用中推斷出對象引用。這可以防止事故。請注意此語法糖的價格,C#程序員通常不會意識到訂閱事件會保留對目標對象的引用。造成難以診斷的泄漏是常見的事故。

C++/CLI中的顯式語法允許在C#中完全缺少的功能,它支持unbound delegates。它不是特別有用,但它確實模擬了C++中方法指針的工作方式。可能的原因C++/CLI沒有采用C#糖。

+0

非常豐富。 – rohit

相關問題