国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

基于C#委托的深入分析

2020-01-24 03:25:09
字體:
來源:轉載
供稿:網友

1.委托的定義

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

委托簡單的示例:

復制代碼 代碼如下:

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

利用委托的構造函數創建委托
復制代碼 代碼如下:

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

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

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

2.委托的調用列表

從上一個例子看,委托變量可以引用某一個方法,調用它就相當于調用這個方法。

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

因為委托變量不僅可以引用另一個方法,還可以組合多的方法并批量執行它們。

復制代碼 代碼如下:

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這樣的委托變量可稱為多路委托變量。

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

復制代碼 代碼如下:

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

           
        }
    }
}

如果委托定義的方法有返回值,則多路委托變量的返回值為委托調用列表中最后一個方法的返回值,中間調用的方法返回值會被丟棄。

使用泛型委托:

 Func系列委托

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

public delegate TResult Func<Tresult>();

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

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 马鞍山市| 七台河市| 湛江市| 大洼县| 兴国县| 景洪市| 敦煌市| 林甸县| 高雄市| 连云港市| 陕西省| 崇左市| 海门市| 邢台县| 汉寿县| 青龙| 尼木县| 平乐县| 连州市| 内乡县| 海林市| 霍城县| 都匀市| 寿光市| 武功县| 临海市| 双流县| 霍林郭勒市| 扶绥县| 平陆县| 新丰县| 荥经县| 南华县| 荆州市| 曲阜市| 通江县| 大同县| 丽江市| 历史| 宁安市| 苍梧县|