a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C# > 正文

基于C#委托的深入分析

2020-01-24 03:25:09
字體:
供稿:網(wǎng)友

1.委托的定義

委托可以看成是一種數(shù)據(jù)類型,可以用于定義變量能接受的值只能是一個(gè)方法。

委托簡(jiǎn)單的示例:

復(fù)制代碼 代碼如下:

namespace DelegateDemo
 {
     class Program
     {
         public delegate int MathOptDelegate(int value1,int value2);
         public int add(int value1, int value2)
         {
             return value1 + value2;
         }

         static void Main(string[] args)
         {
             MathOptDelegate mod;
             Program p = new Program();
             mod =p.add;
             Console.WriteLine(mod(3,5));
             Console.ReadKey();
         }
     }
 }

利用委托的構(gòu)造函數(shù)創(chuàng)建委托
復(fù)制代碼 代碼如下:

namespace DelegateDemo
 {
     class Program
     {
         public delegate int MathOptDelegate(int value1,int value2);
         public int add(int value1, int value2)
         {
             return value1 + value2;
         }

         static void Main(string[] args)
         {

             Program p = new Program();
             MathOptDelegate mod = new MathOptDelegate(p.add);
             Console.WriteLine(mod(3,5));
             Console.ReadKey();
         }
     }
 }

從這個(gè)示例中可以得出這樣的直觀印象:

委托可以堪稱是一個(gè)方法的容器,將某一個(gè)具體的方法裝入后,就可以把它當(dāng)成方法一樣使用。

2.委托的調(diào)用列表

從上一個(gè)例子看,委托變量可以引用某一個(gè)方法,調(diào)用它就相當(dāng)于調(diào)用這個(gè)方法。

如果委托今年僅是方法調(diào)用的另一種形式,那何必多此一舉引入委托這一特性?直接調(diào)用方法不是更簡(jiǎn)單明了?

因?yàn)槲凶兞坎粌H可以引用另一個(gè)方法,還可以組合多的方法并批量執(zhí)行它們。

復(fù)制代碼 代碼如下:

namespace DelegateDemo2
{
    class Program
    {
        public delegate void MyDelegate(String str);
        public static void hello(String str)
        {
            Console.WriteLine(str+"你好");
        }
        public static void goodbye(String str)
        {
            Console.WriteLine(str+"再見");
        }
        static void Main(string[] args)
        {
            MyDelegate a,b,c,d;
            a = Program.hello;
            a("a");
            b = Program.goodbye;
            b("b");
            c = a + b;//等價(jià)將兩個(gè)方法體合并
            c("c");// c你好 c再見
            d = c - a;
            d("d");//d再見
            Console.ReadKey();

           
        }
    }
}

像C這樣的委托變量可稱為多路委托變量。

可以用加法運(yùn)算符來組合單個(gè)委托變量為多路委托變量。類似的,也可以使用減法運(yùn)算符來從一個(gè)多路委托變量中移除某個(gè)委托變量。

復(fù)制代碼 代碼如下:

namespace DelegateDemo2
{
    class Program
    {
        public delegate void MyDelegate(String str);
        public static void hello(String str)
        {
            Console.WriteLine(str+"你好");
        }
        public static void goodbye(String str)
        {
            Console.WriteLine(str+"再見");
        }
        static void Main(string[] args)
        {
            MyDelegate a,b,c,d;
            a = Program.hello;
            a("a");
            b = Program.goodbye;
            b("b");
            c = a + b;//等價(jià)將兩個(gè)方法體合并
            c("c");// c你好 c再見
            d = c - a;
            d("d");//d再見
            Delegate[] ds;
            ds = c.GetInvocationList();
            foreach(Delegate s in ds)
            {
                Console.WriteLine(s);
                //DelegateDemo2.Program+MyDelegate
                //DelegateDemo2.Program+MyDelegate
            }
            Console.WriteLine(ds.Length);
            Console.ReadKey();

           
        }
    }
}

如果委托定義的方法有返回值,則多路委托變量的返回值為委托調(diào)用列表中最后一個(gè)方法的返回值,中間調(diào)用的方法返回值會(huì)被丟棄。

使用泛型委托:

 Func系列委托

以下是Func熄了委托的定義,依其泛型類型參數(shù)的多少有多個(gè)重載形式:

public delegate TResult Func<Tresult>();

public delegate TResult Func<T,Tresult>();

 

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 久久久久国产精品一区二区 | 国产精品1区二区 | 91偷拍精品一区二区三区 | 国产精品美女久久久久高潮 | 日韩精品| 亚洲六月丁香色婷婷综合久久 | 欧美9999 | 伊人超碰| 国产伦精品一区二区三区四区视频 | 午夜影院a | 国产精品日产欧美久久久久 | 久久久久久一区 | 蜜臀91精品国产高清在线观看 | 在线免费中文字幕 | 欧美在线观看网站 | caoporn国产精品免费公开 | 日本亚洲欧美 | 美日韩一区二区 | 日韩在线免费 | 午夜精品久久久久久久蜜桃app | 成人精品一区二区三区电影黑人 | 福利电影在线观看 | 日日操综合| 日本视频在线观看 | 亚洲精品第一页 | 不卡一区| 干干干操操操 | 国产一区二区三区91 | 欧美精品免费在线观看 | 一区二区网站 | 亚洲一区二区 | 久久精品综合 | 精品亚洲成a人片在线观看 99在线免费视频 | 亚洲精品国品乱码久久久久 | 九九热精品视频 | 精品人成 | 日韩在线视频一区 | 欧美成人精品激情在线观看 | 成人午夜| 狠狠艹| 精品久久久久一区二区三区 |