麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > C# > 正文

基于C#委托的深入分析

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

1.委托的定義

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

委托簡單的示例:

復(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();
         }
     }
 }

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

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

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

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

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

因為委托變量不僅可以引用另一個方法,還可以組合多的方法并批量執(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;//等價將兩個方法體合并
            c("c");// c你好 c再見
            d = c - a;
            d("d");//d再見
            Console.ReadKey();

           
        }
    }
}

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

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

復(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;//等價將兩個方法體合并
            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)用列表中最后一個方法的返回值,中間調(diào)用的方法返回值會被丟棄。

使用泛型委托:

 Func系列委托

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

public delegate TResult Func<Tresult>();

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

 

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 国产精品久久久久久久久久东京 | 国内精品久久久久久久影视红豆 | 在线影院av | 色域tv | 亚洲精品久久久久久久久久久 | 成人午夜一区 | 日韩av成人| 毛片av网 | 成人勉费视频 | 国产日产精品久久久久快鸭 | 欧美aⅴ在线观看 | 禁漫天堂久久久久久久久久 | 色成人在线| 少妇一级淫片高潮流水电影 | 国内精品伊人久久 | 免费香蕉成视频成人网 | 黄色网址电影 | 羞羞的视频 | 国产成人精品自拍视频 | 国产亚洲精品久久久久久久久久 | bt 自拍 另类 综合 欧美 | 免费黄网站在线播放 | 一本一本久久a久久精品综合小说 | 中国fx性欧美xxxx | 黄网站免费观看视频 | 黄色片网站免费观看 | 欧美成人免费 | 国产免费高清在线视频 | 成人性视频免费网站下载软件 | 国产分类视频 | 国产1区视频 | 日本免费不卡一区二区 | 精品乱码久久久久 | 亚洲成年人免费网站 | 亚洲一区二区在线 | 久草视频2 | 亚洲天堂午夜 | 亚洲成人在线视频网站 | aaaaa国产欧美一区二区 | 99视频有精品视频高清 | 3xxx|