C 委託補充01

2022-03-17 02:58:15 字數 2187 閱讀 3053

根據對委託的理解,委託可以把乙個方法當作引數進行傳遞,利用這個特性我們可以使用委託,實現外掛程式設計。

public delegate int transformer(int x);

class util

}}class test;

util.transform(values, sqare);

foreach(int i in values)

}static int sqare (int x) => x * x;

}

這裡的transform方法就是外掛程式方法,它接受乙個委託引數。

所有的委託都有多播的能力。這就意味著乙個委託可以引用乙個方法,或者引用乙個組方法。委託使用 += 和 -=運算子聯結多個委託例項。

public class people{}

public class student:people{}

public delegate void action();

class program

static void write()

action action = say;

action += write;//action = action + write;

action();

/*say hi

write anything

*/}

委託會按照新增的順序依次觸發。如果存在返回值,那麼呼叫者會將最後乙個帶有非void返回值型別的方法返回值進行返回,其他的返回值將會拋棄。

- 和-= 運算子會從左側委託運算元中將右側的委託操作刪除。

對於為值為null的委託執行 + 或者+= 操作,等價於為委託指定乙個新的值。同樣在當委託只有乙個目標方法時,執行-=操作等價於為委託指定null值。

由於委託是乙個類,所以委託是不可變,每次執行 += 或者-= 實質上等價於從新建立乙個新的委託例項,並為它賦值。

具體使用,比如說我們要建一棟大樓,需要很長一段時間,但是公司有要求每建好一層需要給公司匯報一下。

public delegate void progressreporter(int floor);

public class edifice

}}class test

static void writeprogresstoconsole(int fool) => console.writeline($"層已建成");

static void advisetocompany(int fool) => console.writeline($"**專案,已經建好層。");

}

委託型別可以包含泛型型別引數,如:

public delegate t transformer(t t);
通過乙個泛型引數,我們可以定義乙個通用的transformer,讓它對任何型別都有效:

public class util

}}class test;

util.transformer(values, square);

foreach(int i in values)

}static int sqare (int x) => x * x;

}

既然委託支援泛型引數,那麼就可以定義一些小型的委託型別,它們可以具有任意的返回型別和合理的數目的引數,類如系統定義好的action委託和func委託(out和in標記可變性修飾符,在逆變和協變中有解釋)。

delegate void action();

delegate void action(t arg);

delegate void action(t1 arg1, t2 arg2)

………delegate tresule func(out tresule)();

delegate tresule func(t arg);

delegate tresule func(t1 arg1, t2 arg2)

………

其中action和func 都可以支援16個引數。

上面的transform重寫.

public static void transform(t values, functransformer)

}

參考自c#7.0核心技術指南

C 委託與事件 後續補充

針對昨天文章 委託 讓方法可以跟簡單物件一樣作為引數進行傳遞,也就是將方法作為引數進行封裝。方法 本質就是 段 其實也好理解,目的就是為了封裝,多型,既然簡單物件如int i可以做為引數傳遞,那麼語句 段應該也可以作為引數傳遞。委託之於方法就像父類之於子類 委託就是乙個抽象化的方法型別定義 目的也是...

C 委託 委託概述

c 委託概述 委託這個詞在生活中經常用到,委託律師打官司,委託房地產公司購買房子。委託保險 人辦理保險。委託就是把事情交給別人去辦。c 中的委託和生活中的委託很相似,如果將乙個方法委託給乙個物件,那麼這個物件就可以全權 這個方法執行。委託宣告定義乙個類,它是從 system.delegate 類派生...

C 委託 匿名委託

c 委託 匿名委託 委託變數在繫結方法時,是把方法名賦值給了委託變數名,這 樣就需要在類裡面定義方法,而有些方法只用到了 次,這樣的 方法在類裡面過多時,程式的可讀性就不是太好,針對這種情 況,可以使用匿名委託,即不用在類裡面額外定義方法.delegate定義的匿名委託 格式 delegate 引數...