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

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

委托知識整理筆記

2019-11-14 13:49:22
字體:
來源:轉載
供稿:網友

委托知識整理筆記

一、委托基礎

1.1   委托是什么

     與類、枚舉、結構、接口一樣,委托也是一種類型。類是對對象的抽象,委托是對函數的抽象。一個委托代表了具有相同參數列表和返回值的(具有相同簽名(signature))所有函數。

1.2   為什么要使用委托?能給我帶來哪些好處?

     有時在程序設計時,某個方法在執行時可能需要根據不同情形做不同處理并且這些情形根據時間可能還會有變動,所以這部分代碼沒法寫死。所以C#就設計了委托來處理這些情形,將這些變化不定的細節交由委托來處理,委托來代理多個類似的處理方法。

     這樣使用委托方法作為方法參數的做法,具體執行細節由被代理方法完成的方式??梢员苊庠诔绦蛑写罅渴褂肐f-Else(Switch)判斷語句,同時使得程序具有更好的可擴展性。       

1.3   如何使用?使用方法步驟有哪些呢?

        e.g:

 1 //第一步.聲明一個委托 2  3  delegate int DelegateAdd(int a, int b); 4  5 public class Test 6  7    { 8  9         //第二步.提供要處理方法10 11         public static  int  Add(int a, int b)12             {13 14             int c = 0;15 16             c = a + b;17 18             return c;19 20         }21 22     }23 24     //入口類25 26     public class TestB27 28     {29 30         public static void Main()31 32         {33 34             //第三步.實例一個委托35 36            DelegateAdd da = new DelegateAdd (Test.Add);37 38             //4第四步調用委托39 40             int sum = da(2, 2);41 42             Console.WriteLine(sum.ToString());43 44         }45 46     }

 

     上面寫法是一種形式(靜態方法或實例方法),下面兩種方式也可實現:

     匿名方法:

     DelegateAdd da = delegate(int a, int b){

         return a+b;

     }

     Lambda表達式方法:

     DelegateAdd da = (a,b)=>a+b;

1.4   委托鏈

     委托可以用 “+=” 和 “-=” 進行增加與刪除委托實例;當增加多個委托實例時就形成了委托鏈表,即委托鏈。調用時,按照方法被添加的順序依次執行。

1.5   泛型委托

    泛型委托支持在委托返回值和參數上應用參數類型。

    

    delegate void GenericsDelegate<T>(T value);    public class GenericsDelegateClass    {        public static void F(int i)        {            Console.WriteLine("調用 F(int i) 方法 i="+i);        }        public static void G(string s)        {            Console.WriteLine("調用 G(string s) 方法 s="+s);        }        public static void Test()        {            GenericsDelegate<string>p2=G;            p2("test");            GenericsDelegate<int>p1= new GenericsDelegate<int>(F);            p1(222);        }    }

 

     幾個常用泛型委托

     Action<T,&hellip;>是無返回值的泛型委托,這個委托類存在不同的變體,至少0個參數,至多16個參數;

     Func<…T>是必須有返回值T的泛型委托,也存在不同的變體,至少0個參數,至多16個參數;

     PRedicate <T>是返回值為bool的泛型委托,只有1個參數;表示定義一組條件并確定指定對象是否符合這些條件的方法。此委托由 Array 和 List 類的幾種方法使用,用于在集合中搜索元素。

    

    public class DelegateClass    {        public DelegateClass()        {        }        public static void Print<T>(T v)        {            Console.WriteLine(v.ToString());        }        public static int Add(int a, int b)        {            return a+b;        }        public static double AddTow(double a)        {            return a+ 2;        }        public static void Test()        {            Action<int>acInt= new Action<int>(Print<int>);            acInt(3); //3            Action<string>acString=Print<string>;            acString("hello string");//hello string            Func<int, int, int>f1= new Func<int, int, int>(Add);            Console.WriteLine(f1(2, 3));//5            Func<double, double>f2=AddTow;            Console.WriteLine(f2(33.45));//35.45

List<int>list= new List<int>() { 1,2,3,4,5,6,7,8,9,10}; Predicate<int>p= new Predicate<int>((v) =>v< 5); var LessThanFive=list.Find(p); if (LessThanFive!= 0) { Console.WriteLine(LessThanFive);// 輸出第一匹配1 } Predicate<int>p1= new Predicate<int>((v) =>v>= 11); int NotLessThanTen=list.Find(p1); if (NotLessThanTen!= 0) { Console.WriteLine(NotLessThanTen); } else { Console.WriteLine("未找到符合條件的元素");//未找到符合條件的元素 } } }

 

二、委托的同步調用、異步調用與異步回調

     同步調用

     以上介紹的委托調用方法都是同步調用。其實也可以Invoke方法用來進行同步調用。

如:f1.Invoke(1,2);同步調用也可以叫阻塞調用,它將阻塞當前線程,然后執行調用,調用完畢后再繼續向下進行。如果是要調用一項耗時操作,可能會讓程序停頓很長時間,造成糟糕的用戶體驗,這時候異步調用就很有必要了。

    異步調用

    異步調用不阻塞線程,而是把調用塞到線程池中,程序主線程或UI線程可以繼續執行。委托的異步調用通過BeginInvoke和EndInvoke來實現。

     

        public static void PrintList(List<int>l)        {            foreach (var one in l)            {                Console.WriteLine(one.ToString());                System.Threading.Thread.Sleep(300);            }        }        public static void Test()        {            List<int>list= new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };            Action<List<int>>acList=PrintList;            acList.BeginInvoke(list,null,null);            System.Threading.Thread.Sleep(600);            Console.WriteLine("其他方法");                       acList.EndInvoke(result);            Console.WriteLine("其他操作");}

 

運行結果:

 

可以看到,主線程并沒有等待,而是直接向下運行了。但是問題依然存在,當主線程運行到EndInvoke時,如果這時調用沒有結束(這種情況很可能出現),這時為了等待調用結果,線程依舊會被阻塞。

異步回調

     用回調函數,當調用結束時會自動調用回調函數,解決了為等待調用結果而讓線程依舊被阻塞的局面。

       

        public static void PrintList(List<int>l)        {            foreach (var one in l)            {                Console.WriteLine(one.ToString());                System.Threading.Thread.Sleep(300);            }        }        static void MyCallBack(IAsyncResultresult)        {            Action<List<int>>handler= (Action<List<int>>)result.AsyncState;            handler.EndInvoke(result);            Console.WriteLine("異步執行完畢");        }        public static void Test()        {            List<int>list= new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };            Action<List<int>>acList=PrintList;            IAsyncResultresult=acList.BeginInvoke(list, new AsyncCallback(MyCallBack), acList);            System.Threading.Thread.Sleep(600);            Console.WriteLine("其他方法");
//acList.EndInvoke(result); Console.WriteLine("其他操作");}

 

執行結果:

 

三、應用場景

委托可應用于Observer模式(觀察者模式)、子窗口傳值、異步更新主界面(如:進度條)等。

以winform進度條為例:

namespace DelegateTest{    public delegate void DelegateMethod(ProgressBar pb, int position);    public partial class MainForm : Form    {        public MainForm()        {            InitializeComponent();        }        public void progressBarDel(ProgressBar pb, int position)        {            if (pb.InvokeRequired)//等待異步              {                DelegateMethod fc=new DelegateMethod(progressBarDel);                this.Invoke(fc,pb, position);//通過代理調用刷新方法              }            else            {                this.progressBar1.Value=position;            }        }         private void MainForm_Load(object sender, EventArgs e)        {             this.progressBar1.Maximum= 100;            this.progressBar1.Value= 0;            Thread t=new Thread(progressThread);            t.Start();                 }        void progressThread()        {            for (int i= 1; i< 100; i++)            {                progressBarDel(this.progressBar1, i);                System.Threading.Thread.Sleep(1000);            }        }    }}

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美xxxx14xxxxx性爽| 精品日韩美女的视频高清| 国产精品福利观看| 91av在线免费观看视频| 亚洲精品欧美极品| 91久久久久久久久久久久久| 亚洲人成绝费网站色www| 亚洲激情国产精品| 日韩在线视频播放| 激情亚洲一区二区三区四区| 欧美极品美女电影一区| 欧美xxxx18国产| 亚洲一区二区少妇| 欧美视频13p| 国产精品三级在线| 欧美日韩国产丝袜美女| 国产精品福利在线观看网址| 中文字幕精品影院| 亚洲一区二区福利| 久久在线免费视频| 欧美午夜精品久久久久久浪潮| 清纯唯美亚洲综合| 91香蕉嫩草影院入口| 黄色成人在线播放| 揄拍成人国产精品视频| 久久久久久久香蕉网| 这里只有精品久久| 成人亚洲激情网| 欧美自拍大量在线观看| 亚洲精品久久久久久下一站| 亚洲级视频在线观看免费1级| 亚洲精品国产精品乱码不99按摩| 成人黄色网免费| 精品一区二区三区电影| 国产亚洲精品一区二555| 欧美极品少妇全裸体| 欧美成人午夜激情视频| 一区二区三区在线播放欧美| 国产精品情侣自拍| 国产精品欧美亚洲777777| 欧美性猛交xxxx乱大交| 欧美性xxxx| 川上优av一区二区线观看| 国产日韩欧美夫妻视频在线观看| 欧美肥臀大乳一区二区免费视频| 成人免费网站在线看| 日韩成人av一区| 国产成人精品999| 91a在线视频| 日本一区二区在线免费播放| 亚洲r级在线观看| 国产精品欧美日韩一区二区| 日韩欧美极品在线观看| 亚洲第一中文字幕在线观看| 日韩精品在线视频美女| 亚洲欧美国产va在线影院| 欧美日韩在线视频一区| 一区国产精品视频| 亚洲国产第一页| 91国产美女视频| 欧美一级大胆视频| 性色av一区二区三区在线观看| 欧美一区二区三区四区在线| 久久激情五月丁香伊人| 中文字幕日韩在线视频| 国产999精品久久久影片官网| 久久精品亚洲94久久精品| 欧美性xxxxx极品| 欧美黄色三级网站| 日韩中文字幕免费看| 久99久在线视频| 亚洲精品www久久久| 国产色婷婷国产综合在线理论片a| 精品久久久久久中文字幕一区奶水| 在线播放精品一区二区三区| 秋霞成人午夜鲁丝一区二区三区| 成人a视频在线观看| 成人精品视频久久久久| 日本成人免费在线| 亚洲乱码国产乱码精品精| 亚洲日本成人女熟在线观看| 久久久精品影院| 日韩免费看的电影电视剧大全| 成人网在线免费观看| 少妇高潮久久77777| 97在线视频免费看| 成人在线精品视频| 91丝袜美腿美女视频网站| 午夜精品一区二区三区在线播放| 日本精品久久久久久久| 欧美性高潮在线| 亚洲最大av网站| 亚洲乱码av中文一区二区| 亚洲欧美日韩精品久久奇米色影视| 欧美国产日韩一区二区| 久久国产精品久久久久久久久久| 北条麻妃99精品青青久久| 久久久久久亚洲精品| 国产精品爽爽爽爽爽爽在线观看| 国产亚洲精品久久| 欧美午夜性色大片在线观看| 亚洲精品日韩久久久| 在线成人免费网站| 尤物精品国产第一福利三区| 国产精品美女主播在线观看纯欲| 色在人av网站天堂精品| 成人午夜黄色影院| 成人妇女淫片aaaa视频| 欧美激情亚洲另类| 中文字幕久久久av一区| 日本精品久久电影| 疯狂蹂躏欧美一区二区精品| 91九色蝌蚪国产| 欧美性生交大片免费| 亚洲国产女人aaa毛片在线| 久久视频免费在线播放| 91av在线播放视频| 午夜精品久久久久久久99热| 8090成年在线看片午夜| 97成人精品区在线播放| 欧美在线xxx| 欧美激情免费视频| 国产精品视频区1| 国产精品旅馆在线| 欧美一级淫片播放口| 亚洲女人天堂成人av在线| 中文字幕日韩精品在线观看| 日韩激情av在线免费观看| 性色av香蕉一区二区| 国产精品久久久久久久久借妻| 国产精品入口日韩视频大尺度| 成人动漫网站在线观看| 欧美日韩亚洲一区二区三区| 91精品在线一区| 亚洲男人天堂网站| 欧美日韩国产一区二区三区| 一区二区三区高清国产| 欧亚精品在线观看| 亚洲精品一区二区久| 亚洲第一区中文99精品| 一道本无吗dⅴd在线播放一区| 国产精品ⅴa在线观看h| 蜜月aⅴ免费一区二区三区| 欧美性猛交99久久久久99按摩| 国产精品91久久| 欧美日韩第一页| 欧美床上激情在线观看| 日韩成人性视频| 亚洲欧美综合区自拍另类| 日韩精品极品在线观看| 日韩精品中文在线观看| 亚洲成人久久久久| 性色av一区二区三区红粉影视| 欧美成人一区二区三区电影| 成人免费观看49www在线观看| 亚洲精品一区二区久| 亚洲自拍中文字幕| 亚洲男人天堂视频| 国产精品男人爽免费视频1| 国产视频精品一区二区三区| 亚洲黄色免费三级| 国内偷自视频区视频综合| 日韩免费观看av| 中文字幕欧美专区|