C#委托的介紹(delegate、Action、Func、predicate)

 委托是一個類,它定義了方法的類型,使得可以將方法當作另一個方法的參數來進行傳遞。事件是一種特殊的委托。

  1.委托的聲明

  (1). delegate

??????? delegate我們常用到的一種聲明

  ??Delegate至少0個參數,至多32個參數,可以無返回值,也可以指定返回值類型。

  ? 例:public?delegate?int?MethodtDelegate(int?x,?int?y);表示有兩個參數,并返回int型。

  (2). Action

?????? Action是無返回值的泛型委托。

   Action 表示無參,無返回值的委托

   Action<int,string> 表示有傳入參數int,string無返回值的委托

?  Action<int,string,bool> 表示有傳入參數int,string,bool無返回值的委托

????? ?Action<int,int,int,int> 表示有傳入4個int型參數,無返回值的委托

   Action至少0個參數,至多16個參數,無返回值。

   例:

        public void Test<T>(Action<T> action,T p){action(p);}

 ? ?(3). Func

   Func是有返回值的泛型委托

   Func<int> 表示無參,返回值為int的委托

   Func<object,string,int> 表示傳入參數為object, string 返回值為int的委托

   Func<object,string,int> 表示傳入參數為object, string 返回值為int的委托

   Func<T1,T2,,T3,int> 表示傳入參數為T1,T2,,T3(泛型)返回值為int的委托

   Func至少0個參數,至多16個參數,根據返回值泛型返回。必須有返回值,不可void

????? 例:   

        public int Test<T1,T2>(Func<T1,T2,int>func,T1 a,T2 b){return func(a, b);}

?? ?(4) .predicate

   predicate 是返回bool型的泛型委托

   predicate<int> 表示傳入參數為int 返回bool的委托

   Predicate有且只有一個參數,返回值固定為bool

   例:public?delegate?bool?Predicate<T> (T obj)

  

  2.委托的使用

  (1).Delegate的使用  

復制代碼
        public delegate int MethodDelegate(int x, int y);private static MethodDelegate method;static void Main(string[] args){method = new MethodDelegate(Add);Console.WriteLine(method(10,20));Console.ReadKey();}private static int Add(int x, int y){return x + y;}
復制代碼

  (2).Action的使用   

復制代碼
 static void Main(string[] args){Test<string>(Action,"Hello World!");Test<int>(Action, 1000);Test<string>(p => { Console.WriteLine("{0}", p); }, "Hello World");//使用Lambda表達式定義委托Console.ReadKey();}public static void Test<T>(Action<T> action, T p){action(p);}private static void Action(string s){Console.WriteLine(s);}private static void Action(int s){Console.WriteLine(s);}
復制代碼

  可以使用 Action<T1, T2, T3, T4> 委托以參數形式傳遞方法,而不用顯式聲明自定義的委托。 封裝的方法必須與此委托定義的方法簽名相對應。 也就是說,封裝的方法必須具有四個均通過值傳遞給它的參數,并且不能返回值。 (在 C# 中,該方法必須返回 void)通常,這種方法用于執行某個操作。

  (3).Func的使用

復制代碼
        static void Main(string[] args){Console.WriteLine(Test<int,int>(Fun,100,200));Console.ReadKey();}public static int Test<T1, T2>(Func<T1, T2, int> func, T1 a, T2 b){return func(a, b);}private static int Fun(int a, int b){return a + b;}
復制代碼

  (4).?predicate的使用

  泛型委托:表示定義一組條件并確定指定對象是否符合這些條件的方法。此委托由 Array 和 List 類的幾種方法使用,用于在集合中搜索元素。

復制代碼
        static void Main(string[] args){Point[] points = { new Point(100, 200), new Point(150, 250), new Point(250, 375), new Point(275, 395), new Point(295, 450) };Point first = Array.Find(points, ProductGT10);Console.WriteLine("Found: X = {0}, Y = {1}", first.X, first.Y);Console.ReadKey();}private static bool ProductGT10(Point p){if (p.X * p.Y > 100000){return true;}else{return false;}}
復制代碼

  使用帶有 Array.Find 方法的 Predicate 委托搜索 Point 結構的數組。如果 X 和 Y 字段的乘積大于 100,000,此委托表示的方法 ProductGT10 將返回 true。Find 方法為數組的每個元素調用此委托,在符合測試條件的第一個點處停止。

  3.委托的清空

  (1).在類中申明清空委托方法,依次循環去除委托引用。

???????? 方法如下:

復制代碼
      public MethodDelegate OnDelegate;                public void ClearDelegate()        {             while (this.OnDelegate != null) {                 this.OnDelegate -= this.OnDelegate;  }        } 
復制代碼

  (2).如果在類中沒有申明清空委托的方法,我們可以利用GetInvocationList查詢出委托引用,然后進行去除。  

  方法如下:

復制代碼
        public MethodDelegate OnDelegate; 
     static void Main(string[] args){Program test = new Program();if (test.OnDelegate != null) { System.Delegate[] dels = test.OnDelegate.GetInvocationList(); for (int i = 0; i < dels.Length; i++) {test.OnDelegate -= dels[i] as MethodDelegate;}}}
復制代碼

  4.委托的特點

  委托類似于 C++ 函數指針,但它們是類型安全的。
  委托允許將方法作為參數進行傳遞。
  委托可用于定義回調方法。
  委托可以鏈接在一起;例如,可以對一個事件調用多個方法。
  方法不必與委托簽名完全匹配。

  5.總結:

  ??Delegate至少0個參數,至多32個參數,可以無返回值,也可以指定返回值類型

  Func可以接受0個至16個傳入參數,必須具有返回值

  Action可以接受0個至16個傳入參數,無返回值

  Predicate只能接受一個傳入參數,返回值為bool類型

?

  詳細參考:http://www.fengfly.com/plus/view-209140-1.html

       http://www.cnblogs.com/foolishfox/archive/2010/09/16/1827964.html

轉載于:https://www.cnblogs.com/zhangzhu/p/4373519.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/259183.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259183.shtml
英文地址,請注明出處:http://en.pswp.cn/news/259183.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

版本1.8.1Go安裝以及語法高亮配置

注意點&#xff1a;普通用戶和root用戶高亮要設置兩遍①下載go安裝包 https://golang.org/doc/ 最新的版本&#xff1a;go1.8.1.linux-amd64.tar.gz ②進入主目錄&#xff1a;$:su ~賦給普通用戶root權限&#xff0c;以便執行tar命令&#xff1a;$:su root 把壓縮包解壓到/usr/…

求二叉樹中節點的最大距離

struct node{ Node Left; Node Right; int MaxLeft;//左子樹到該節點的最長距離 int MaxRight;//右子樹到該節點的最長距離 char chValue; }; void FindMaxLen(Node T) { int tmpMax 0; if (NULL T) { return; } if (NULL T->Left) { T->MaxLeft 0; } if (NULL T-&g…

flutter 自定義鍵盤_入門級機械鍵盤選購對比

個人覺得鍵盤這種東西&#xff0c;手感是最重要的&#xff0c;畢竟鍵盤是要拿用的&#xff0c;不是拿來供的。不管鍵盤再怎么好看、酷炫&#xff0c;只要你用起來不舒服、不習慣&#xff0c;那對你而言&#xff0c;就不會是一把好鍵盤。那么&#xff0c;影響手感的因素主要有哪…

騰訊2016校招試題----------格雷碼的實現

問題&#xff1a;產生n位元的所有格雷碼。格雷碼(Gray Code)是一個數列集合&#xff0c;每個數使用二進位來表示&#xff0c;假設使用n位元來表示每個數字&#xff0c;任兩個數之間只有一個位元值不同。例如以下為3位元的格雷碼&#xff1a; 000 001 011 010 110 111 101 100 。…

關于A/D方面的小結

&#xff08;轉載&#xff09;AD精度與分辨率 最近做了一塊板子&#xff0c;當然考慮到元器件的選型了&#xff0c;由于指標中要求精度比較高&#xff0c;所以對于AD的選型很慎重。 很多人對于精度和分辨率的概念不清楚&#xff0c;這里我做一下總結&#xff0c;希望大家不要…

常用表的字段

F:\study\表的設計 一&#xff1a;網站設置有哪些內容&#xff1a; 1>title 表題 2>logo 3>keyword 關鍵字 4>status 是否開啟 5>Internet 備案號 6>url 網址 7>tel 聯系電話 8>brief …

四個好看的CSS樣式表格

1. 單像素邊框CSS表格 這是一個非經常常使用的表格樣式。 源碼&#xff1a; <!-- CSS goes in the document HEAD or added to your external stylesheet --> <style type"text/css"> table.gridtable { font-family: verdana,arial,sans-serif; font-si…

C# COM ArcgisEngine 多線程相關

這段時間做ArcgisEngine&#xff0c;因為在做圖形交叉分析時&#xff0c;計算數據分多個線程分別計算不同的圖形&#xff0c;發現計算錯誤。后來初步了接了是由于所有的ArcObjects組件都被標記為單線程單元&#xff08;STA參考VS幫助文檔&#xff09;。每個STA都限制在一個線程…

loading initial ramdisk 卡住_驛站晨讀 | 一城市多家快遞“卡住了”!有快遞網點直接建議:換別家吧......

編輯&#xff1a;驛站老鬼 主播&#xff1a;若晨?▎美團回應“外賣小哥致電取餐被打成顱腦損傷”10月15日晚&#xff0c;成都溫江區某小區內發生一起顧客毆打外賣員事件&#xff0c;導致外賣員馮某東輕度顱腦損傷以及右膝外側半月板撕裂。據了解&#xff0c;事件起因是顧客要…

CVTE2016校招試題摘選

今年的題分兩部分&#xff0c;時間為晚上7:00-9:30,題目分不定項選擇與兩道編程題。 下面是我自己抄下來的一部分題&#xff0c;盡饗讀者。 1.堆排序屬于下面哪種排序方法&#xff1f; A、選擇排序 B、插入排序、C、交換排序 D、歸并排序 答案&#xff1a; A 2. 用RSA算法…

高手的經驗 硬件

一個硬件高手的設計經驗分享(ZT)大字體 樓主 一&#xff1a;成本節約現象一&#xff1a;這些拉高/拉低的電阻用多大的阻值關系不大&#xff0c;就選個整數5K吧點評&#xff1a;市場上不存在5K的阻值&#xff0c;最接近的是 4.99K&#xff08;精度1%&#xff09;&#xff0c;其…

JavaScript大神用代碼帶你揭秘吉普賽古老神秘讀心術

javascript/HTML5課題&#xff1a;javascript開發讀心術游戲PS:大爆料&#xff01;javascript解密讀心術游戲背后故事知識點&#xff1a;讀心術原理算法獨家揭秘&#xff0c;HTML5最新選擇器&#xff0c;原生javascript動態DOM生成&#xff0c;判斷與循環講解&#xff0c;函數封…

Firefox火狐Flash插件卡死問題完美解決方法(轉載)

http://www.ihacksoft.com/firefox-flash-protectedmode.html 其實這個問題以前就出現過&#xff0c;而最近該問題又出現在最新的 Windows 8.1 系統中。由于從Flash Player 11.3開始&#xff0c;新版本引入了安全沙箱技術&#xff0c;而它一直就是火狐無法正常運行的主要原因。…

.NET Framework 4.5 五個很棒的特性

轉自http://news.cnblogs.com/n/192958/ 英文原文&#xff1a;Five Great .NET Framework 4.5 Features 簡介 自 .NET 4.5 發布已經過了差不多 1 年了。但是隨著最近微軟大多數的發布&#xff0c;與 .NET 開發者交流的問題顯示&#xff0c;開發者僅知道一到兩個特性&#xff0c…

group by很多字段是不是會很慢_女生回復我總很慢,怎么辦?

原標題&#xff1a;女生回復我總很慢&#xff0c;怎么辦&#xff1f;Hello&#xff0c;大家好&#xff0c;我是情圣老司機。有一種問題&#xff0c;可能屬于年輕人才會遇到的問題年輕的兄弟總想控制一切&#xff0c;一切都掌控在自己手上包括今天這個主題&#xff1a;女生總是回…

大眾點評網2016校招試題選錄

大眾點評網的校招題還真有特點&#xff0c;分四部分&#xff0c;第一部分是行測的數字規律類題目&#xff0c;第二部分是行測的圖形規律題&#xff0c;第三部分是C、Java的基礎選擇題&#xff0c;第四部分是四個編程題。 題目都有時間限制&#xff0c;第一二部分皆是普通的行測…

天堂avatar

2010年2月2日晚上12看完期待已久的AVATAR&#xff0c;普通3D。說實在的&#xff0c;沒有預想中的那么好&#xff0c;可能是由于過于期待導致要求太高的緣故。影片故事比較俗套&#xff0c;一如既往的美式英雄主義&#xff0c;最后一分鐘力挽狂瀾。但想想它畢竟是一部商業片&…

BZOJ 1012: [JSOI2008]最大數maxnumber(線段樹)

裸的線段樹...因為數組開小了而一直RE..浪費了好多時間..--------------------------------------------------------------------------#include<cstdio>#include<algorithm>#include<cstring>#include<cctype>#include<iostream>#define rep(i…

如何利用循環代替遞歸以防止棧溢出(譯)

摘要&#xff1a;我們經常會用到遞歸函數&#xff0c;但是如果遞歸深度太大時&#xff0c;往往導致棧溢出。而遞歸深度往往不太容易把握&#xff0c;所以比較安全一點的做法就是&#xff1a;用循環代替遞歸。文章最后的原文里面講了如何用10步實現這個過程&#xff0c;相當精彩…

python環境搭建_Python開發環境搭建安裝開發軟件

0.學習路徑示意圖各位小伙伴大家好&#xff0c;這次樓主分享的是Ubuntu上安裝開發軟件。包含以下這幾個軟件&#xff1a;PycharmAnaconda3GitVim遠程登錄軟件RangerPS&#xff1a;因為以下安裝包都是以root身份安裝的因此&#xff0c;要使用它們必須以root身份登錄su # 以root…