国产探花免费观看_亚洲丰满少妇自慰呻吟_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>();

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 呈贡县| 什邡市| 盐池县| 张北县| 德安县| 托克逊县| 景德镇市| 阜南县| 苗栗县| 阜阳市| 宜都市| 石狮市| 常德市| 五家渠市| 罗平县| 东安县| 南城县| 平阳县| 清远市| 法库县| 丁青县| 河南省| 温泉县| 绥芬河市| 库车县| 塔河县| 宜阳县| 浏阳市| 澄迈县| 镇远县| 祁连县| 平邑县| 惠来县| 江陵县| 怀仁县| 德昌县| 平乡县| 南昌县| 长沙县| 安乡县| 平顶山市|