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