在c# 中,委託類似於c++中的**機制,宣告乙個委託型別,可以分別採用例項方法和靜態方法例項化了委託,所不同的是採用靜態方法例項化的委託,它的
target
屬性為null
;而用例項方法例項化的委託,它的
target
屬性為該例項。但是這裡要注意,如果你用
console.writerline(delegateobj.target)
輸出該例項,結果是該例項的型別,而不是該例項的名字。在c#
中,有關鍵字
delegate
,又有類
delegate
;我們可以用
delegate
來建立乙個類
delegate
的例項:
delegate d = delegate.createdelegate(type type, object target, string method),
createdelegate()
方法有很多過載版本,視具體情況而定。這裡要指出的就是,關於
delegate
的屬性target
的就是類
delegate
的公共屬性
target
。基於這一點,委託也可以動態建立,但必須提供相應的引數:委託的型別,類例項,委託要表示的例項方法的名稱。
委託鏈,可以將幾個(必需是同型別)委託給串接起來,當委託觸發時,就會按照新增是的順序依次呼叫各個委託**函式;特別是,當委託**函式有返回值,只有最後乙個委託**函式的返回值能被帶回,之前的都被會被覆蓋;如果要獲取委託鏈中每乙個**函式的返回值,則可以使用
delegate.getinvocationlist()方法(
其中delegate
是乙個委託
) ,它將返回乙個
delegate
陣列,然後遍歷該陣列,就得到每乙個**函式的返回值,不過要注意,雖然它返回的是
delegate
陣列,但是在遍歷的時候,遍歷元素的型別必須與
delegate
的型別一致,而不是
delegate
型別,例項**如下:
delegate string getstatus();
delegate arrayofdelegates = status.getinvocationlist();
foreach (getstatus getstatus in arrayofdelegates)
catch (exception e) error: ",
environment.newline,
((component == null) ? "" : component.gettype() + "."),
getstatus.method.name, e.message);}}
其中status的型別是getstatus,而getstatus就是乙個委託型別。注意上述**中getstatus 的型別是getstatus,而不是delegate型別。
同時,如果委託型別的返回值為
class(父類)
,存在乙個返回值為
subclass(子類)
的方法,那麼這個方法也是可以用來初始化這個委託型別的,**示例:
class mammals
}class dogs : mammals
}class program
public static dogs secondhandler()
static void main()
}輸出結果為
mammals
mammals
dogs
另外,如果委託型別的引數為
subclass(子類)
,存在乙個引數為
class(父類)
的方法,那麼這個方法也是可以用來初始化乙個委託型別的,**示例如下:
class mammals
}class dogs : mammals
}class program
public static void secondhandler(dogs sheepdog)
static void main(string args)
}輸出結果為:
mammals
dogs
mammals
dogs
另外乙個問題是,如果在委託鏈中有乙個**函式丟擲了異常,不會影響其他的**函式的執行,就好像異常沒有發生一樣。
目前我們所見到的委託都是通過乙個命名方法來宣告乙個委託,在
c#2.0
以後就引入了匿名方法來宣告乙個委託,其建立方法很簡單,就是把**塊作為委託的引數來宣告即可,如下:其中
d就是乙個用匿名方法例項化的委託。
delegate void del(int x);
del d = delegate(int k) ;
這種委託的好處就是通過避免寫乙個方法來減少**量,其最常見的乙個應用就是建立執行緒。示例如下:
system.threading.thread t1 = new system.threading.thread
(delegate()
);t1.start();
但是匿名方法又很多限制,比如在其**塊不可以使用
goto, break, continue
等從**塊中跳到**塊外面,反之也是不可以的。
命名與匿名方法**混合使用,**示例:
delegate void printer(string s);
class testclass ;
p("the delegate using the anonymous method is called.");
p = new printer(testclass.dowork);
p("the delegate using the named method is called."); }
static void dowork(string k)
} 事件:
事件用於類或結構體通知物件來處理一些事情,事件是對
delegate
的應用,而且宣告乙個事件的時候,必須提供乙個
delegate
型別,如下形式:
public delegate void sampleeventdelegate(object sender, eventargs e);
public class sampleeventsource
通過delegate,事件可以封裝型別安全的方法,並在被觸發的時候呼叫。宣告了乙個事件後,可以註冊多個方法到這個事件中,並且這些方法的引數型別、返回值,即signature必須一致。如在乙個事件中同時註冊裡幾個方法,那麼可以通過事件的getinvocationlist()方法來返回乙個delegate陣列,通過遍歷這個陣列,就可以得到所有**函式(事件處理函式)的資訊。事件的呼叫形式必須與其宣告時的delegate的signature(簽名)一致,如上面宣告的事件sampleevent,在呼叫的時候必須如下形式呼叫:sampleevent(object, system.eventargs.empty)。
c 委託與事件
c 委託與事件 心得 c 用委託來實現事件通知機制。委託相當與c 函式指標。整個過程涉及乙個呼叫者,乙個被呼叫者,還有就是這個委託。實現步驟有以下幾步 1.申明委託,2.定義呼叫者和呼叫的函式,3.定義被呼叫者和具體實現的函式 被呼叫的函式 1.申明委託 在包裡或者類裡,public public ...
C 委託與事件
1.泛型委託 泛型型別 是可適應對多種資料型別執行相同功能的單個程式設計元素。定義泛型類或過程時,無需為可能需要對其執行該功能的每個資料型別定義單獨版本。就好比是帶有可拆卸刀頭的螺絲刀。您檢查需要擰動的螺絲,然後選擇適合該螺絲的刀頭 一字 十字 星形 將正確的刀頭插入到螺絲刀柄上後,您就可以使用螺絲...
C 委託與事件
委託 和事件在.net framework 中的應用非常廣泛,然而,較好地理解委託和事件對很多接觸c 時間不長的人來說並不容易。c 委託和事件它們就像是一道檻兒,過了這個檻的人,覺得真是太容易了,而沒有過去的人每次見到委託和事件就覺得心裡憋得慌,渾身不自在。本文中,我將通過兩個範例由淺入深地講述什麼...