日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Delegate

發(fā)布時(shí)間:2025/3/15 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Delegate 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
      • 1.什么是委托
      • 2.委托概述
      • 3.聲明委托類型
      • 4.創(chuàng)建委托對(duì)象
      • 5.給委托賦值
      • 6.組合委托
      • 7.為委托添加/移除方法
      • 8.調(diào)用委托
      • 9.委托的示例
      • 10.調(diào)用帶返回值的委托
      • 11.調(diào)用帶引用參數(shù)的委托
      • 12.匿名方法
        • 12.1 使用匿名方法
        • 12.2 匿名方法的語法
          • 12.2.1 返回類型
          • 12.2.2 參數(shù)
          • 12.2.3 params參數(shù)
      • 13.Lambda表達(dá)式
      • 14.常見泛型委托
        • 14.1 Action
        • 14.2 Func
        • 14.3 Predicate

1.什么是委托

可以認(rèn)為委托是持有一個(gè)或多個(gè)方法的對(duì)象,此對(duì)象可以執(zhí)行它所“持有”的方法。

delegate void Del(int value); class Program { static int a = 1; static void Up(int v) { Console.WriteLine($"{a + v}"); } static void Down(int v) { Console.WriteLine($"{a - v}"); } static void Main() { Del del1 = new Del(Up); Del del2 = new Del(Down); del1(1); del2(1); Console.ReadKey(); }

output

2 0

2.委托概述

使用委托與類的比較,入下圖:

可以把委托看作是包含有序方法列表的對(duì)象,這些方法具有相同的簽名和返回類型:

  • 方法的列表稱為調(diào)用列表
  • 委托保存的方法可以來自任何類或結(jié)構(gòu),只有匹配一下兩點(diǎn):
    • 委托的返回類型
    • 委托的簽名(包括ref和out修飾符)
  • 調(diào)用列表中的方法可以是實(shí)例方法也可以是靜態(tài)方法
  • 在調(diào)用委托時(shí),會(huì)執(zhí)行其調(diào)用列表中的所有方法

3.聲明委托類型

委托類型定義了委托對(duì)象調(diào)用列表中允許的方法的形式,如下示例代碼聲明了委托類型:

delegate void MyDel( int x ); // delegate為關(guān)鍵字,void為返回類型,MyDel為委托類型名,int為簽名

委托聲明與方法聲明的不同:

  • 以delegate關(guān)鍵字開頭
  • 沒有方法主體
  • 不需要在類內(nèi)部聲明,因?yàn)樗穷愋吐暶?/li>

4.創(chuàng)建委托對(duì)象

委托類型的變量聲明如下:

MyDel delVar;

有兩種創(chuàng)建委托對(duì)象的方式,第一種是使用new運(yùn)算符, new運(yùn)算符的操作數(shù)組成如下:

  • 委托類型名
  • 一組圓括號(hào),其中包含作為調(diào)用列表中的第一個(gè)成員的方法的名字
delVar = new MyDel(Class1.Method1);

還可以使用以下快捷語法創(chuàng)建委托對(duì)象:

delVar = Class1.Method1;

5.給委托賦值

由于委托時(shí)引用類型,可以通過賦值來改變包含在委托變量中的引用,舊的委托對(duì)象會(huì)被垃圾回收器回收。

MyDel delVar; delVar = Class1.Method1; delVar = Class1.Method2; // Class1.Method1將會(huì)被GC

6.組合委托

委托可以調(diào)用額外的運(yùn)算符來“組合”。

MyDel delA = Class1.Method1; MyDel delB = Class1.Method2; MyDel delC = delA + delB; // 組合調(diào)用列表


7.為委托添加/移除方法

使用+=運(yùn)算符為委托添加方法:

MyDel delA = Class1.Method1; // 創(chuàng)建并初始化 delA = Class2.Method2; // 增加方法 delA = StaticClass.StaticMethod; // 增加方法

由于委托是不可變的,所以每添加一個(gè)方法其實(shí)是創(chuàng)建了一個(gè)新的委托。 使用-=運(yùn)算符為委托移除方法:

delA -= Class2.Method2; // 從委托移除方法

移除一個(gè)方法同樣是創(chuàng)建了一個(gè)新的委托。 移除委托時(shí)的注意事項(xiàng):

  • 如果再調(diào)用列表中有多個(gè)相同的方法,將從列表最后開始搜索,并移除第一個(gè)匹配方法
  • 試圖刪除委托中不存在的方法沒有效果
  • 試圖調(diào)用空委托會(huì)拋出異常,若調(diào)用列表為空,則委托是null

8.調(diào)用委托

可以向調(diào)用方法一樣簡(jiǎn)單的調(diào)用委托。

Mydel delVar = inst.MyM1; delVar += SCl.m3; delVar += X.Act; ... delVar(55);

在使用參數(shù)調(diào)用委托時(shí)會(huì)使用相同的參數(shù)值(如55)。


9.委托的示例

delegate void PrintFunction(); class Test { public void Print1() { Console.WriteLine("Print1 -- instance"); } public static void Print2() { Console.WriteLine("Print2 -- static"); } } class Program { static void Main() { Test t = new Test(); PrintFunction pf = t.Print1; pf += Test.Print2; pf += t.Print1; pf += Test.Print2; if(null!=pf) { pf(); } else { Console.WriteLine("Delegate is empty"); } Console.ReadKey(); } }

output

Print1 -- instance Print2 -- static Print1 -- instance Print2 -- static

10.調(diào)用帶返回值的委托

delegate int MyDel(); class MyClass { int value = 5; public int Add2() { value += 2; return value; } public int Add3() { value += 3; return value; } } class Program { static void Main() { MyClass mc = new MyClass(); MyDel md = mc.Add2; md += mc.Add3; md += mc.Add2; Console.WriteLine($"value = {md()}"); Console.ReadKey(); } }

output

value = 12

最后一個(gè)方法執(zhí)行的返回值是委托的返回值。


11.調(diào)用帶引用參數(shù)的委托

在調(diào)用委托列表中的下一個(gè)方法時(shí),參數(shù)的新值回傳給下一個(gè)方法

delegate void MyDel(ref int x); class MyClass { public void Add2(ref int x) { x += 2; } public void Add3(ref int x) { x += 3; } static void Main() { MyClass mc = new MyClass(); MyDel md = mc.Add2; md += mc.Add3; md += mc.Add2; int x = 5; md(ref x); Console.WriteLine($"value = {x}"); Console.ReadKey(); } }

output

value = 12

12.匿名方法

匿名方法是在初始化委托時(shí)內(nèi)聯(lián)聲明的方法。

12.1 使用匿名方法

  • 聲明委托變量時(shí)作為初始化表達(dá)式
  • 組合委托時(shí)在賦值語句的右邊
  • 為委托增加事件時(shí)在賦值語句的右邊

12.2 匿名方法的語法

匿名方法表達(dá)式的語法包含以下組成部分:

  • delegate類型關(guān)鍵字
  • 參數(shù)列表,無參可省略
  • 語句塊,包含匿名方法的代碼
delegate ( Parameters ) { ImplementationCode }
12.2.1 返回類型

若委托的返回類型為int,則匿名方法中也應(yīng)返回int。

delegate int Del(int n); static void Main() { Del d = delegate(int x) { return x + 20; } // 返回一個(gè)整型值 }
12.2.2 參數(shù)

除了數(shù)組參數(shù),匿名方法的參數(shù)列表必須與委托有以下匹配:

  • 參數(shù)數(shù)量
  • 參數(shù)類型及位置
  • 修飾符 以下兩個(gè)情況都滿足可以簡(jiǎn)化匿名方法的參數(shù)列表:
  • 委托的參數(shù)列表不包含任何out參數(shù)
  • 匿名方法不使用任何參數(shù)
delegate void Del(int x); Del d = delegate { PrintMessage(); CleanUp(); };
12.2.3 params參數(shù)

如果委托聲明的參數(shù)列表包含params參數(shù),那么匿名方法的參數(shù)列表將忽略params關(guān)鍵字:

delegate void Del(int x, params in[] y); Del d = delegate(int x, int[] y){...}; delegate void MyDel(int x, params int[] y); class MyClass { static void Main() { MyDel md = delegate (int x, int[] y) { foreach(var i in y) { Console.WriteLine(i); } }; md(1, 2, 3, 4); Console.ReadKey(); } }

output

2 3 4

13.Lambda表達(dá)式

使用Lambda表達(dá)式創(chuàng)建委托:

MyDel del = delegate(int x) {return x + 1;}; // 匿名方法 MyDel newdel = (int x) => {return x + 1;}; // Lambda表達(dá)式

Lambda表達(dá)式的簡(jiǎn)化規(guī)則:

  • 編譯器可從委托聲明中得到委托參數(shù)的類型(ref和out參數(shù)須注明類型)
    • 帶有類型的參數(shù)列表稱為顯示類型
    • 省略類型的參數(shù)列表稱為隱式類型
  • 如果只有一個(gè)隱式類型參數(shù),則可以省略圓括號(hào)
  • Lambda允許表達(dá)式主體是語句塊或表達(dá)式 Lambda表達(dá)式的語法演示如下:

Lambda表達(dá)式的語法由Lambda運(yùn)算符和左邊的參數(shù)部分以及右邊的Lambda主體構(gòu)成。


14.常見泛型委托

14.1 Action

Action<>委托可以擁有n個(gè)參數(shù)(0-16),無返回值。

class Program {static void Method1() { Console.WriteLine("without any parameter"); } static void Method2(int i) { Console.WriteLine($"the int is {i}"); } static void Method3(string s, double d) { Console.WriteLine($"the string is {s}, the double is ozvdkddzhkzd"); } static void Main() { Action A1 = Method1; Action<int> A2 = Method2; Action<string, double> A3 = Method3; A1(); A2(1); A3("hello", 3.14); Console.ReadKey(); } }

output

without any parameter the int is 1 the string is hello, the double is 3.14

14.2 Func

Func<>委托可以擁有n個(gè)參數(shù)(1-16),類型參數(shù)中的最后一個(gè)作為返回值類型。因此類型參數(shù)不能為空,至少有一個(gè)返回類型。

class Program {static int Method1(int i) { return i * 10; } static string Method2(int a, double d) { return (a + d).ToString(); } static void Main() { Func<int, int> F1 = Method1; Func<int, double, string> F2 = Method2; Console.WriteLine($"{F1(10)}"); Console.WriteLine($"{F2(1, 3.14)}"); Console.ReadKey(); } }

output

100 4.14

14.3 Predicate

Predicate<>委托擁有一個(gè)參數(shù),其返回值為bool型。

class Program {static bool Method(int i) { return i > 0 ? true : false; } static void Main() { Predicate<int> P = Method; Console.WriteLine(P(10)); Console.ReadKey(); } }

output

True

通過匿名方法使用Predicate<>,

class Program {static void Main() { var anomynous = new Predicate<int>(delegate (int i) { return i > 0 ? true : false; }); Console.WriteLine(anomynous(1)); Console.ReadKey(); } }

output

True

轉(zhuǎn)載于:https://www.cnblogs.com/jizhiqiliao/p/10649160.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的Delegate的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。