C 委託與事件

2021-04-18 11:42:04 字數 3571 閱讀 7458

在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 委託和事件它們就像是一道檻兒,過了這個檻的人,覺得真是太容易了,而沒有過去的人每次見到委託和事件就覺得心裡憋得慌,渾身不自在。本文中,我將通過兩個範例由淺入深地講述什麼...