亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

詳解C#委托

2019-11-14 15:44:25
字體:
來源:轉載
供稿:網友

   1  委托

    當要把方法傳遞給其他方法時,需要使用委托。有時候某個方法執行的操作并不是針對數據進行的,而是要對另一個方法進行操作。但是編譯的時候,我們不知道第二個方法是什么,這個信息只有在運行時得到,所以需要我們把第二個方法作為參數傳遞給第一個方法??傊芯褪菂禐榉椒ǖ暮瘮?。

    事件——一般是通知代碼發生了什么事件。引發了事件時,運行庫需要知道應該執行哪個方法。這就要把處理事件的方法作為一個參數傳遞給委托。

    1.1  聲明委托

    首先必須定義要使用的委托,對于委托,定義它就是告訴編譯器這種類型的委托表示哪種類型的方法,然后必須創建該委托的一個或者多個實例。編譯器在后臺將創建表示該委托的一個類。語法如下:

    delegate void IntMethodInvoker(int x);

    在這個實例中,定義了一個委托IntMethodInvoker,并指定該委托的每個實例都可以包含一個方法的引用,該方法含有一個int參數,返回void。定義一個委托,必須給出它所表示的方法的簽名和返回類型。定義委托的語法類似方法的定義,但是沒有方法體,定義的前面要加上關鍵字delegate。可以在委托的定義上應用常用的訪問修飾符:public、PRivate、protected等。

    定義委托實際上是定義一個新類。委托實現為派生自基類System.MulticastDelegate的類,System.MulticastDelegate又派生自基類System.Delegate。C#編譯器能識別這個類自動使用其委托語法,我們不需要了解這個類的具體執行情況。

    定義好委托后就可以創建它的一個實例,但創建的委托的實例仍然稱為委托。

    1.2  使用委托

    下面代碼說明如何使用委托,這是在int上調用ToString()方法的一種冗長方式。

  

  private delegate string GetAString();//定義委托,表示的方法不帶參數,返回一個string型的值。    static void Main()    {     int x=40;           GetAString firstStringMethod=new GetAString(x.TOString);//實例化類型為GetAString的委托,并對它進行初始化,//使它引用整形變量x的ToString()方法。在C#中,委托在語法上總是接受一個參數的構造函數,這個參數就是委托引用的方法。//這個方法必須匹配最初定義委托時的簽名。           Console.WriteLine("String is {0}",firstStringMethod());  //使用委托顯示字符串//在任何代碼中,都應該提供委托實例的名稱,這里例子實例名稱為firstStringMethod,后面括號中應該包含調用委托中方法時使用的任何等效參數    } 

 

    在C#編譯時,編譯器會用firstString.Method.Invoke()代替firstStringMethod()。(這是IDE內部實現的,不需要編程者關心,這里只是說明下它的原理。)

    為了減少代碼,只需要委托實例,就可以只傳送地址的名稱,這稱為委托推斷。舉例如下:

    GetAString firstStringMethod =new GetAString(x.ToString);//正常用法

    GetAString firstStringMethod=x.ToString;//委托推斷的用法

    注意:千萬不能輸入x.ToString()。因為加()的方法是返回一個字符串對象,不加括號代表方法地址,委托調用的是方法地址。

    委托的類型是安全的,可以保證被調用的方法簽名正確。

    1.3  Action<T>和Func<T>委托

    以上都是為參數和返回類型定義一個新委托。下面介紹Action<T>委托,泛型Action<T>委托表示引用一個void返回類型方法。Func<T>委托可以調用帶返回類型的方法。Func<out TResult>委托類型可以調用帶返回類型且無參數的方法,Func<int T,out TResult>調用一個帶參數的方法。

    舉例聲明一個該委托類型的數組:

    Func<double ,double>[] Operations=

{

   類名.方法名,類名.方法名

}

    1.4  一個委托的例子:類的冒泡法排序

     class BubbleSorter{  static public void Sort<T>(IList<T> sortArray,Func<T,T,bool>comparison)//接受類型T的泛型方法Sort<T>  {      bool swapped=true;      do       {             swapped=false;             for(int i=0;i<sortArray.Count-1;i++)            {                   if(comparison(sortArray[i+1],sortArray[i]))                    {                        T temp=sortArray[i];                        sortArray[i]=sortArray[i+1];                        sortArray[i+1]=temp;                        swapped=true;                     }                            }                }while(swapped);          }}     class Employee{    public Employee(string name,decimal salary)    {          this.Name=name;this.Salary=salary;     }     public string Name{get;private set;}    public decimal Salary{get;private set;}     public static bool CompareSalary(Employee e1,Employee e2)  {        return e1.Salary<e2.Salary;   }}

 

Main函數調用時:

static void Main(){     Employee[] employees={     new Employee("Buges",2000),     new Employee("Daffy",1000),  new Employee("Foge",2300),  new Employee("Tows",5000),  new Employee("Gay",2100)};BubbleSorter.Sort(employees,Employee.ConpareSalary);//調用類的靜態方法}

 

1.5多播委托

    委托可以包含多個方法,那就是多播委托。為此委托的簽名必須返回void;否則就只能得到委托調用的最后一個方法的結果。多播委托可以識別運算符”+“和”+=“。

    Action<double>operation1=類名1.方法名1;

    Action<double>operation2=類名2.方法名2;

    Action<double>operationS=operation1+operation2;

    多播委托可以用”-“和”-=“以從委托中刪除方法調用。

    多播委托派生自System.MulticastDelegate的類,System.MulticastDelegate又派生自基類System.Delegate。MulticastDelegate的其他成員允許把多個方法調用鏈接成一個列表。

    多播委托要避免依賴于特定順序的代碼。

    如果通過委托調用其中一個方法拋出異常,整個迭代就停止了。為了避免這個問題,Delegate類定義了GetInvocationList()方法,它返回一個Delegate對象數組。先中科院使用這個委托調用與委托直接相關的方法,捕獲異常并繼續下一次迭代。

Action d1= One;d1+=Two;Delegate[] delegates=d1.GetInvocationList();foreach (Action d in delegates){  try  {    d();  }  catch(Exception)  {   Console.WriteLine("Exception caught");  }}

 

1.6  Lambda表達式

    只要有委托參數類型的地方,就可以使用Lambda表達式。簽名使用匿名方法的例子可以改為使用Lambda表達式。Lambda運算符”=>“的左邊列出了需要的參數。Lambda運算符右邊定義了賦予lambda變量的方法的實現代碼。

Func<string,string>oneParam=s=>String.Format("change uppercase{0}",s.ToUpper());Console.WriteLine(oneParam("test"));

 

    1.6.1  參數

Func<double,double,double>twoParamsWithTypes=(double x,double y)=>x*y;Console.WriteLine(twoParamsWithTypes(4,2));

   1.6.2 多行代碼

Func<double,double>square=x=>x*x;

等價于

Func<double,double>square=x=>{   return x*x;}

添加多行語句要有括號和return語句

Func<string,string>lambda=param=>{   param+=mid;   param+=" and this was added to the string.";   return param;}

 

 

    

    

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美大片在线免费观看| 国产精品日韩欧美大师| 国产日韩在线一区| 91欧美日韩一区| 韩国一区二区电影| 色哟哟入口国产精品| 一本大道香蕉久在线播放29| 精品国产区一区二区三区在线观看| 国产一区二区日韩精品欧美精品| 96精品视频在线| 欧美xxxx14xxxxx性爽| 国产一区二区三区在线播放免费观看| 搡老女人一区二区三区视频tv| 国产日韩欧美夫妻视频在线观看| 欧美乱人伦中文字幕在线| 亚洲欧美日韩中文视频| 成年无码av片在线| 久久中国妇女中文字幕| 欧美成人精品在线| 国产视频精品免费播放| 狠狠色狠狠色综合日日小说| 国产精品国产自产拍高清av水多| 欧美成年人网站| 青青在线视频一区二区三区| 久久全球大尺度高清视频| 一区二区三区美女xx视频| 亚洲欧洲偷拍精品| 日韩人体视频一二区| 日本中文字幕久久看| 日韩av在线不卡| 国产精品久久久久久久久久99| 伊人精品在线观看| 最近2019中文字幕在线高清| 国产精品69久久久久| 久久国产精品久久国产精品| 亚洲国产精彩中文乱码av在线播放| 91精品视频网站| 国产成人啪精品视频免费网| 亚洲视屏在线播放| 国产自摸综合网| 国产亚洲精品va在线观看| 国产精品2018| 北条麻妃99精品青青久久| 久久91精品国产91久久久| 91情侣偷在线精品国产| 宅男66日本亚洲欧美视频| 欧美精品日韩www.p站| 欧美日韩在线一区| 国产精品嫩草影院久久久| 91精品国产91久久久久久吃药| 青草青草久热精品视频在线网站| 国产91ⅴ在线精品免费观看| 成人黄色免费网站在线观看| 欧美日韩一区二区免费视频| 日韩视频第一页| 亚洲综合最新在线| 国产精品美女主播在线观看纯欲| 欧美国产中文字幕| 亚洲va欧美va国产综合久久| 中文日韩在线视频| 久久久久久国产三级电影| 粉嫩av一区二区三区免费野| 亚洲欧美日韩国产精品| 在线观看国产成人av片| 日韩美女在线播放| www.久久色.com| 国产情人节一区| 欧美性高跟鞋xxxxhd| 欧美日韩成人黄色| 日韩大胆人体377p| 亚洲乱码国产乱码精品精| 国产精品视频一区国模私拍| 日韩av网站导航| 91视频免费在线| 国产成人一区二区| 国产精品欧美一区二区| 欧美成人在线免费| 一本色道久久综合狠狠躁篇怎么玩| 国产精品极品在线| 欧美精品999| 国产日韩精品一区二区| 在线观看国产精品91| 欧美在线免费视频| 午夜精品久久久久久久99黑人| 一本大道久久加勒比香蕉| 精品美女永久免费视频| 国产视频亚洲精品| 51久久精品夜色国产麻豆| 亚洲黄色av女优在线观看| 最好看的2019年中文视频| 另类视频在线观看| 亚洲欧美日韩精品| 国产综合在线看| 国产欧亚日韩视频| 在线观看免费高清视频97| 日韩最新免费不卡| 91精品国产乱码久久久久久蜜臀| 综合欧美国产视频二区| 欧美巨乳美女视频| 欧洲成人在线视频| 国产一区在线播放| 亚洲精品福利资源站| 中文国产成人精品久久一| 国产精品成人av在线| 2019亚洲日韩新视频| 欧美在线观看日本一区| 色综久久综合桃花网| 久久综合伊人77777蜜臀| 欧美日韩福利在线观看| 亚洲人午夜精品| 韩国精品久久久999| 国产亚洲欧洲高清一区| 最新日韩中文字幕| 国产亚洲精品久久久久动| 亚洲淫片在线视频| 国产精品吊钟奶在线| 精品亚洲永久免费精品| 国产精品69精品一区二区三区| 操日韩av在线电影| 亚洲**2019国产| 欧美极品欧美精品欧美视频| 欧美大片网站在线观看| 国产精品福利久久久| 日韩av综合中文字幕| 在线成人激情黄色| 久久精品电影网站| 91九色国产视频| 97在线精品视频| 欧美男插女视频| 日韩精品免费在线视频观看| 欧美黄色成人网| 欧美日韩激情小视频| 亚洲图片制服诱惑| 国产精品扒开腿做爽爽爽视频| 中文字幕在线国产精品| 欧美www在线| 亚洲天天在线日亚洲洲精| 亚洲片在线资源| 久久成人亚洲精品| 亚洲va欧美va在线观看| 91久久国产综合久久91精品网站| 国产日韩欧美夫妻视频在线观看| 欧美激情视频在线免费观看 欧美视频免费一| 大量国产精品视频| 成人性生交xxxxx网站| 日韩大陆毛片av| 亚洲va码欧洲m码| 久久精品国产v日韩v亚洲| 亚洲天堂久久av| 国产91精品久久久久| 555www成人网| 一区二区三区美女xx视频| 欧美日韩国产va另类| 欧美国产乱视频| 亚洲高清一二三区| 国产xxx69麻豆国语对白| 亚洲欧美一区二区精品久久久| 国产欧美一区二区三区在线| 久久天天躁夜夜躁狠狠躁2022| 国产一区二区三区在线看| 久久久久久久一区二区三区| 亚洲a在线播放| 亚洲欧美激情在线视频| 亚洲另类xxxx|