標籤:串連 logs 之間 mil 最大 編譯錯誤 gif pre 協助
可以任務委託是持有一個或多個方法的對象。當然,正常情況下你不會去執行一個對象,但是委託與對象不同。可以執行委託,這是委託就會執行他所"持有"的方法。
舉個栗子就如同 你媳婦讓你去買兩個包子, 你就是那個 委託 ,買包子是你所持有的方法,當然這樣舉得栗子稍有不妥,但是能協助理解一些委託的基本概念。
委託的概述:
委託與對象的對照
| 宣告類型 |
聲明類 |
聲明委託(類型) |
| 宣告類型的變數 |
聲明類類型的變數 |
聲明委託類型的變數 |
| 填充變數 |
建立累的執行個體並且把
它的引用賦值給變數 |
建立委託的執行個體並且把
它的執行個體賦值給變數並且
添加一個方法 |
| 使用變數 |
使用類對象 |
調用委託 |
1.委託的聲明:
委託就好像類一樣,必須要在建立變數及類型前聲明。
delegate void Demo(int x)
delegate :委託的關鍵字
void:傳回型別
Demo:委託類型名
(int x):簽名
2.建立委派物件:
建立委託變數
Demo Mydemo;
建立委派物件
Mydemo=new Demo(執行個體名.方法)Mydemo=new Demo(類名.方法)
建立委派物件要有委託名,括弧內的是添加到委託內的方法,可以是執行個體方法也可以是靜態方法。
我們還可以使用快捷文法類進行委託的建立,它只有 方法說明符構成。
Mydemo=執行個體名.方法Mydemo=類名.方法
可以這樣做的原因是 方法名稱和其相應的委託類型之間存在隱式轉換。
3.給委託賦值:
因為委託是參考型別,我們可以給委託賦值來改變包含在委託變數內的引用,改變之後,原有的委託對象會被記憶體回收行程回收。
Mydemo=InsertObj.other1
4.組合委託:
委託是可以使用額外的運算子來“組合”。這個運算會建立一個新的委託,其調用列表串連了作為運算元的兩個委託的調用列表副本。
Mydemo demo1=Mathod.Mym1;Mydemo demo2=Sclass.Mym2;Mydemo demo3=demo1+demo2;
組合委託總覺得好像運算元被改變一樣。事實上委託是恒定的,委派物件被建立後不能再被改變。
(圖示中的方法與代碼不同,意義一樣。)
5.向委託添加方法:
運算子: +=
Mydemo demo=inst.Mym1;demo+=scl.m3;demo+=x.act;
當為委託添加方法的時候,其實委託是不可變的,當向委託中添加方法的時候是其實是產生一個新的委託。
所以向委託中添加了三個方法後的結果其實是變數指向一個全新的委託。
6.移除方法:
運算子: -=
移除方法與添加方法一樣,本質上都是建立了一個新的委託,新的委託是舊的委託的副本----值是沒有了已經被移除方法的引用。
7.調用委託:
Mydemo demo=inst.Mym1;demo+=scl.m3;demo+=x.act;
demo(123);//調用委託
如果一個方法在委託中出現多次那麼,每次在執行列表中遇到方法的時候都會被執行一次。
8.完整委託執行個體:
delegate void Mydele(string str); public class Myclass { public void PritStr1(string str) { Console.WriteLine(str); } public static void PritStr2(string str) { Console.WriteLine(str); } } class Program { static void Main(string[] args) { Myclass cla = new Myclass(); Mydele dele = cla.PritStr1;//執行個體化委託 //給委託添加方法 dele += Myclass.PritStr2; //調用委託 dele("測試一下"); Console.ReadKey(); } }
9.帶傳回值的委託:
delegate int Mydele(); public class Myclass { int str = 10; public int PritStr1() { return str+=1; } public int PritStr2() { return str+=2; } } class Program { static void Main(string[] args) { Myclass cla = new Myclass(); Mydele dele = cla.PritStr1;//執行個體化委託 //給委託添加方法 dele += cla.PritStr2; //調用委託 Console.WriteLine("傳回值是:{0}",dele()); Console.ReadKey(); } }
10.調用使用引用參數的委託:
對於委託中的引用參數與 在方法中是一樣的。參數傳遞的值地址,所以在每一個方法內對數值的操作都會體現出來。
delegate void Mydele(ref int x); public class Myclass { public void PritStr1(ref int x) { x += 2; } public void PritStr2(ref int x) { x += 1; } } class Program { static void Main(string[] args) { Myclass cla = new Myclass(); Mydele dele = cla.PritStr1;//執行個體化委託 //給委託添加方法 dele += cla.PritStr2; //調用委託 int x = 5; dele(ref x); Console.WriteLine("X的值是{0}",x); Console.ReadKey(); } }
匿名方法:
匿名方法的產生是因為在程式中有的方法只需要執行一次,本著最大限度節省時間、節省人力的奮鬥方針,程式猿大牛們發明了---匿名方法。一種不需要聲明、建立執行個體、配合委託直接使用的方法。
——>普通具名方法(low到爆啊)
delegate int Mydele(int x); public class Myclass { public int PritStr1( int x) { x += 2; return x; } } class Program { static void Main(string[] args) { Myclass cla = new Myclass(); Mydele dele = cla.PritStr1;//執行個體化委託 Console.WriteLine("X的值是{0}",dele(10)); Console.WriteLine("X的值是{0}", dele(1)); Console.ReadKey(); } }
——>匿名方法(高富帥)
class Program { delegate int Mydele2(int x); static void Main(string[] args) { Mydele2 dele = delegate(int x) { return x + 10; }; Console.WriteLine("X的值是{0}", dele(1)); Console.ReadKey(); } } 匿名方法的文法:
匿名方法的主要文法包括:
1.delegate, 關鍵字。
2.參數列表,如果語句塊沒有任何參數則可以省略。
3.語句塊,包含匿名方法的代碼。
1.傳回型別
匿名方法不會顯示聲明傳回值,實現匿名方法的時候必須返回一個類型與委託傳回型別相同的值。如果委託聲明的是Void,那麼匿名方法就不能有傳回值。
這一點是遵從於委託的基本概念, 參數 與傳回型別都需要與委託聲明的時候相符合才可以。
2.參數
方法簽名必須與委託相符合。
簽名包括: 1.參數數量 2.參數類型及位置 3.修飾符
省略參數列表的前提是: 1.委託參數不包含任何out修飾符。 2.匿名方法不適用任何參數。
3.Params參數
委託型別宣告的時候最後一個參數必須是Params
匿名參數的列表是可以忽略Params關鍵字的
delegate void Mydele(int x,params int[] y);Mydele dele=delegate(int x,int[] y){//具體代碼};4.匿名方法變數的範圍
- 外圍範圍的變數叫做外部變數。
- 用在匿名方法實現代碼中的外部變數成為方法捕獲。
delegate void Mydele(int x,params int[] y);int xx=5;Mydele dele=delegate(int x,int[] y){//具體代碼console.writeline("捕獲:{0}",xx);//使用了外部變數};console.writeline("{0}",x);//編譯錯誤,超出範圍
Lambda運算式:
拉姆達運算式其實就是 委託和匿名方法的 2.0 變得更加簡潔方便。
Mydele dele= delegate(int x) {return x+1;};//匿名方法Mydele dele= (int x) => {return x+1;};//省略delegate 使用=>(goes to) Mydele dele= (x) => {return x+1;};//省略類型Mydele dele= x => {return x+1;};//省略圓括弧Mydele dele= x => x+1; //省略return
| ----->>>>任重而道遠,這艱辛路上怎能沒有你的支援和鼓勵。 |
C#基礎之------委託