初識委託 事件

2021-09-07 16:30:39 字數 3295 閱讀 6970

這個是我剛入行第乙個感興趣的知識點,翻了翻不知道什麼時候記的筆記,覺得有必要把自己學的知識在梳理一遍,有一些點比當時更清晰;在這裡,先將一位大牛的部落格貼出來,有興趣的可以去看看,很詳細的介紹了委託與事件,讀了幾遍受益匪淺:

c# 中的委託和事件

c#中的委託和事件(續)

本文例項是在vs2013下實現的

剛剛學習委託可能會有些困惑,不知道委託是什麼,怎麼用,有什麼好處,下面我會通過乙個簡單的場景來進行說明。

場景:假設下某人班回到家,依次開啟燈,開啟熱水器,開啟電視。

我們先定義乙個房子:

public class house

public void openheater()

public void opentv()

}

下面我們先利用委託來進行執行開燈、開熱水器、開電視的操作,我們先定義乙個無引數無返回值的委託(事實上.net已經有乙個內建的action委託),在建立乙個開啟電器的方法:

delegate void openmachinehandle();

static void openmachine(openmachinehandle openhandle)

然後我們就可以這樣來實現開啟電器:

static void main(string args)

我們可以看到我們是將house的三個例項方法當作引數來進行傳遞,不過有人會說,這個我們可以直接呼叫方法來進行實現啊?你看這還多了乙個openmachine的方法不是?現在假設不是用委託,並且能用openmachine的方法開啟電器(這種的需求會有的,比方說openmachine是我作為第三方發布的介面),裡面使用了if-else或switch來進行分辨;但是,改需求了xd,增加開啟洗衣機了,這樣子我的介面也需要變化以適應新的需求,再發布,需求再變動那豈不是改的沒完沒了?

這裡我們直接開啟電器方法當作引數來使用,以後增加新的開啟電器犯法就可以不用修改openmachine這個統一入口,只是在主程式裡面增加一行呼叫即可;這樣子可以在某些場景下還可以減少使用if-else或switch語句,在一定程度上解耦程式,使得程式具有更好的可擴充套件性

當然,委託也可以繫結多個方法(靜態方法、例項方法都可以,只要引數與返回值與委託的一樣即可),以上程式我們還可以這麼改,我們可以無視掉openmachine這個統一入口,然後例項化乙個委託,直接將開啟電器方法直接繫結到委託上面,然後讓這個例項代我們執行所有繫結好的方法,例項化還有另外的方法,不過+=是增加繫結,-=是移除繫結,這些是一定的。

static void main(string args)

在物件導向中,講究對物件的封裝,我們可以將delegate的例項封裝到乙個類中,這樣可以更方便的在客戶端中使用,這裡建立乙個person類:

public class person

public openmachinehandle openmachinehandle;

public void openmachine()

}

我們就可以這樣使用委託:

static void main(string args)

開門回家......", caster.name);

caster.openmachine();

console.readline();

}

看到這裡大家可能會覺得稍微有些問題,openmachinehandle第一次繫結方法是=賦值語法,後面的才會變為+=註冊的方式,還有這裡直接使用了openmachinehandle這乙個委託變數,但是在物件導向中,不是所有的成員變數都可以公布出來的,對於普通的成員變數來說,可以使用屬性來進行封裝,但是委託變數使用屬性還是解決不了第乙個問題,於是就可以使用事件event來對委託進行封裝了,這樣,我們改寫person類:

public class person

public event openmachinehandle openmachine;

public void opendoor()

}

宣告事件的同時會預設構造乙個私有的openmachinehandle委託(就行上面宣告乙個name屬性時會預設構造乙個私有變數一樣),詳細可以翻閱上面大牛的部落格,我也正在研究中;改寫完畢之後,我們再重新在主程式裡面使用:

static void main(string args)

開門回家......", caster.name);

caster.opendoor();

console.readline();

}

這裡我們就可以直接使用+=註冊方法來繫結想要執行的事件,前面我說過openmachinehandle這個委託是無引數無返回值的,那麼openmachinehandle這個可以完全的換成action這乙個內建委託。

delegate我們常用到的一種宣告

delegate至少0個引數,至多32個引數,可以無返回值,也可以指定返回值型別。

例:public delegate int methodtdelegate(int x, int y);表示有兩個引數,並返回int型。

action是無返回值的泛型委託。

action 表示無參,無返回值的委託

action表示有傳入引數int,string無返回值的委託

action表示有傳入引數int,string,bool無返回值的委託

action表示有傳入4個int型引數,無返回值的委託

action至少0個引數,至多16個引數,無返回值。

例:public void test(actionaction,t p)

func是有返回值的泛型委託

func表示無參,返回值為int的委託

func表示傳入引數為object, string 返回值為int的委託

func表示傳入引數為object, string 返回值為int的委託

func表示傳入引數為t1,t2,,t3(泛型)返回值為int的委託

func至少0個引數,至多16個引數,根據返回值泛型返回。必須有返回值,不可void

例:   

public int test(funcfunc,t1 a,t2 b)

predicate 是返回bool型的泛型委託

predicate表示傳入引數為int 返回bool的委託

predicate有且只有乙個引數,返回值固定為bool

例:public delegate bool predicate(t obj)

我對於委託的學習總結就暫時到此結束,東西不是很多,更深層的**實現和設計思想還有待學習,希望能給對於委託還不了解的人有一定的幫助!

c 委託事件

1,什麼是委託 委託是什麼?從生活理解就像是你是乙個c 程式設計師,你對c 並不了解,當需要進行c 分析的時候你委託給你的一位懂c 的同事幫你來完成 在c 中,委託的作用是這樣描述的 委託就像乙個函式的指標,在程式執行時可以使用它們來呼叫不同的函式。簡單點說,委託能夠引用函式,通過傳遞位址的機制完成...

C 委託事件

一 委託 委託類似於函式指標,但函式指標只能引用靜態方法,而委託既能引用靜態方法,也能引用例項方法。委託使用分三步 1 委託宣告。2 委託例項化。3 委託呼叫。例程一 程式 using system namespace 委託 private int add int num1,int num2 例中,...

簡單委託事件

public delegate void titlehander 宣告乙個委託 public event titlehander tilename 宣告乙個事件,事件型別是委託 user u1 new user 類例項化物件 u1.tilename new user.titlehander chan...