C#委托的介绍(delegate、Action、Func、predicate),

寄托是贰个类,它定义了办法的体系,使得能够将艺术当作另一个措施的参数来开展传递。事件是生机勃勃种独特的寄托。

  1.信托的证明

  (1). delegate

        delegate大家常用到的豆蔻梢头种评释

    Delegate起码0个参数,至多31个参数,能够无再次回到值,也足以内定再次来到值类型。

   
例:public delegate int MethodtDelegate(int x, int y);表示有七个参数,并重临int型。

  (2). Action

       Action是无重返值的泛型委托。

   Action 代表无参,无重返值的信托

   Action<int,string> 表示有传出参数int,string无重回值的嘱托

   Action<int,string,bool>
表示有传播参数int,string,bool无再次回到值的嘱托

       Action<int,int,int,int>
表示有传出4个int型参数,无重临值的信托

   Action起码0个参数,至多21个参数,无重返值。

   例:

        public void Test<T>(Action<T> action,T p)
        {
            action(p);
        }

    (3). Func

   Func是有再次来到值的泛型委托

   Func<int> 表示无参,再次回到值为int的寄托

   Func<object,string,int> 表示传入参数为object, string
再次回到值为int的寄托

   Func<object,string,int> 表示传入参数为object, string
再次回到值为int的寄托

   Func<T1,T2,,T3,int>
表示传入参数为T1,T2,,T3(泛型)重临值为int的委托

  
Func起码0个参数,至多十六个参数,依据再次来到值泛型重临。必须有再次来到值,不可void

      例:   

        public int Test<T1,T2>(Func<T1,T2,int>func,T1 a,T2 b)
        {
            return func(a, b);
        }

    (4) .predicate

   predicate 是回到bool型的泛型委托

   predicate<int> 表示传入参数为int 重返bool的信托

   Predicate有且独有多少个参数,重返值固定为bool

   例:public delegate bool Predicate<T> (T obj)

  

  2.信托的选用

  (1).Delegate的使用  

威尼斯人平台 1

        public delegate int MethodDelegate(int x, int y);
        private static MethodDelegate method;
        static void Main(string[] args)
        {
            method = new MethodDelegate(Add);
            Console.WriteLine(method(10,20));
            Console.ReadKey();
        }

        private static int Add(int x, int y)
        {
            return x + y;
        }

威尼斯人平台 2

  (2).Action的使用   

威尼斯人平台 3

 static void Main(string[] args)
        {
            Test<string>(Action,"Hello World!");
            Test<int>(Action, 1000);
            Test<string>(p => { Console.WriteLine("{0}", p); }, "Hello World");//使用Lambda表达式定义委托
            Console.ReadKey();
        }
        public static void Test<T>(Action<T> action, T p)
        {
            action(p);
        }
        private static void Action(string s)
        {
            Console.WriteLine(s);
        }
        private static void Action(int s)
        {
            Console.WriteLine(s);
        }

威尼斯人平台 4

  能够运用 Action<T1, T2, T3, T4>
委托以参数情势传递情势,而不用显式申明自定义的寄托。
封装的不二秘籍必须与此委托定义的格局签字相呼应。
相当于说,封装的方法必得有所多少个均经过值传递给它的参数,并且不能够重回值。
(在 C# 中,该措施必须回到 void卡塔 尔(阿拉伯语:قطر‎常常,这种措施用于推行有些操作。

  (3).Func的使用

威尼斯人平台 5

        static void Main(string[] args)
        {
            Console.WriteLine(Test<int,int>(Fun,100,200));
            Console.ReadKey();
        }
        public static int Test<T1, T2>(Func<T1, T2, int> func, T1 a, T2 b)
        {
            return func(a, b);
        }
        private static int Fun(int a, int b)
        {
            return a + b;
        }

威尼斯人平台 6

  (4). predicate的使用

  泛型委托:表示定义生龙活虎组条件并规定钦点对象是不是相符这几个条件的法子。此委托由
Array 和 List 类的两种艺术应用,用于在汇聚中搜索元素。

威尼斯人平台 7

        static void Main(string[] args)
        {
            Point[] points = { new Point(100, 200), 
            new Point(150, 250), new Point(250, 375), 
            new Point(275, 395), new Point(295, 450) };
            Point first = Array.Find(points, ProductGT10);
            Console.WriteLine("Found: X = {0}, Y = {1}", first.X, first.Y);
            Console.ReadKey();
        }
        private static bool ProductGT10(Point p)
        {
            if (p.X * p.Y > 100000)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

威尼斯人平台 8

  使用带有 Array.Find 方法的 Predicate 委托找出 Point 结构的数组。假若X 和 Y 字段的乘积大于 100,000,此委托代表的格局 ProductGT10 将回到
true。Find
方法为数组的每种成分调用此委托,在切合测验条件的第一个点处结束。

  3.寄托的清空

  (1).在类中表北魏空委托方法,依第二轮回去除委托援用。

         方法如下:

威尼斯人平台 9

      public MethodDelegate OnDelegate;                
        public void ClearDelegate()        
        {             
            while (this.OnDelegate != null) 
            {                 
                this.OnDelegate -= this.OnDelegate;  
            }        
        } 

威尼斯人平台 10

  (2).固然在类中绝非表明朝空委托的主意,大家能够动用GetInvocationList查询出委托援用,然后开展删减。  

  方法如下:

威尼斯人平台 11

        public MethodDelegate OnDelegate; 
     static void Main(string[] args)
        {
            Program test = new Program();

            if (test.OnDelegate != null) 
            { 
                System.Delegate[] dels = test.OnDelegate.GetInvocationList(); 
                for (int i = 0; i < dels.Length; i++) 
                {
                    test.OnDelegate -= dels[i] as MethodDelegate;
                }
            }
        }

威尼斯人平台 12

  4.委托的性状

  委托相近于 C++ 函数指针,但它们是项目安全的。
  委托允许将艺术作为参数进行传递。
  委托可用以定义回调方法。
  委托能够链接在一块儿;比如,能够对三个事件调用多少个方法。
  方法不必与寄托签字完全协作。

  5.总结:

 
  
Delegate起码0个参数,至多叁13个参数,能够无重临值,也得以钦定再次回到值类型

  Func能够接纳0个至17个传入参数,必得怀有重返值

  Action能够采用0个至17个传入参数,无重回值

  Predicate只可以采用多少个扩散参数,再次来到值为bool类型

 

  详细参考:

       

委托是二个类,它定义了措施的门类,使得能够将艺术当做另叁个格局的参数来拓宽传递。事…

在上学泛型时遇见的迷离平日与func<T,U>混淆,总以为最后贰个值是回来类型。今后分别一下,原本难题出在泛型委托上。

C#委托的牵线(delegate、Action、Func、predicate)

  委托是贰个类,它定义了艺术的品类,使得可以将艺术充作另一个措施的参数来进行传递。事件是风度翩翩种万分的委托。

  1.信托的扬言

  (1). delegate

        delegate大家常用到的风姿罗曼蒂克种证明

    Delegate最少0个参数,至多叁12个参数,可以无重临值,也得以钦点再次来到值类型。

   
例:public delegate int MethodtDelegate(int x, int y);表示有五个参数,并回到int型。

  (2). Action

       Action是无重临值的泛型委托。

   Action 表示无参,无重回值的寄托

   Action<int,string> 表示有扩散参数int,string无再次来到值的信托

   Action<int,string,bool>
表示有传出参数int,string,bool无再次回到值的信托

       Action<int,int,int,int>
表示有扩散4个int型参数,无再次回到值的信托

   Action至少0个参数,至多十七个参数,无重回值。

   例:

        public void Test<T>(Action<T> action,T p)
        {
            action(p);
        }

    (3). Func

   Func是有再次来到值的泛型委托

   Func<int> 表示无参,再次回到值为int的寄托

   Func<object,string,int> 表示传入参数为object, string
重返值为int的寄托

   Func<object,string,int> 表示传入参数为object, string
再次回到值为int的寄托

   Func<T1,T2,,T3,int>
表示传入参数为T1,T2,,T3(泛型)重临值为int的委托

  
Func起码0个参数,至多14个参数,依照重返值泛型重返。必需有再次来到值,不可void

      例:   

        public int Test<T1,T2>(Func<T1,T2,int>func,T1 a,T2 b)
        {
            return func(a, b);
        }

    (4) .predicate

   predicate 是回到bool型的泛型委托

   predicate<int> 表示传入参数为int 重返bool的信托

   Predicate有且独有四个参数,重返值固定为bool

   例:public delegate bool Predicate<T> (T obj)

  

  2.寄托的选取

  (1).Delegate的使用  

威尼斯人平台 13

        public delegate int MethodDelegate(int x, int y);
        private static MethodDelegate method;
        static void Main(string[] args)
        {
            method = new MethodDelegate(Add);
            Console.WriteLine(method(10,20));
            Console.ReadKey();
        }

        private static int Add(int x, int y)
        {
            return x + y;
        }

威尼斯人平台 14

  (2).Action的使用   

威尼斯人平台 15

 static void Main(string[] args)
        {
            Test<string>(Action,"Hello World!");
            Test<int>(Action, 1000);
            Test<string>(p => { Console.WriteLine("{0}", p); }, "Hello World");//使用Lambda表达式定义委托            Console.ReadKey();
        }
        public static void Test<T>(Action<T> action, T p)
        {
            action(p);
        }
        private static void Action(string s)
        {
            Console.WriteLine(s);
        }
        private static void Action(int s)
        {
            Console.WriteLine(s);
        }

威尼斯人平台 16

  能够使用 Action<T1, T2, T3, T4>
委托以参数形式传递形式,而不用显式注脚自定义的信托。
封装的秘技必须与此委托定义的秘诀签字相呼应。
也便是说,封装的章程必需具备八个均经过值传递给它的参数,况兼不能够再次回到值。
(在 C# 中,该措施必需重临 void卡塔尔国通常,这种方式用于推行某些操作。

  (3).Func的使用

威尼斯人平台 17

        static void Main(string[] args)
        {
            Console.WriteLine(Test<int,int>(Fun,100,200));
            Console.ReadKey();
        }
        public static int Test<T1, T2>(Func<T1, T2, int> func, T1 a, T2 b)
        {
            return func(a, b);
        }
        private static int Fun(int a, int b)
        {
            return a + b;
        }

威尼斯人平台 18

  (4). predicate的使用

  泛型委托:表示定义意气风发组条件并规定内定对象是否顺应这个原则的措施。此委托由
Array 和 List 类的二种办法运用,用于在集合中寻找成分。

威尼斯人平台 19

        static void Main(string[] args)
        {
            Point[] points = { new Point(100, 200), 
            new Point(150, 250), new Point(250, 375), 
            new Point(275, 395), new Point(295, 450) };
            Point first = Array.Find(points, ProductGT10);
            Console.WriteLine("Found: X = {0}, Y = {1}", first.X, first.Y);
            Console.ReadKey();
        }
        private static bool ProductGT10(Point p)
        {
            if (p.X * p.Y > 100000)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

威尼斯人平台 20

  使用含有 Array.Find 方法的 Predicate 委托寻找 Point 结构的数组。假如X 和 Y 字段的乘积大于 100,000,此委托代表的诀要 ProductGT10 将赶回
true。Find
方法为数组的种种成分调用此委托,在切合测量试验条件的第三个点处截止。

  3.寄托的清空

  (1).在类中表南陈空委托方法,依次轮回去除委托引用。

         方法如下:

威尼斯人平台 21

      public MethodDelegate OnDelegate;                
        public void ClearDelegate()        
        {             
            while (this.OnDelegate != null) 
            {                 
                this.OnDelegate -= this.OnDelegate;  
            }        
        } 

威尼斯人平台 22

  (2).如果在类中并未有说汉朝空委托的方式,大家能够利用GetInvocationList查询出委托援引,然后开展删减。  

  方法如下:

威尼斯人平台 23

        public MethodDelegate OnDelegate; 
     static void Main(string[] args)
        {
            Program test = new Program();

            if (test.OnDelegate != null) 
            { 
                System.Delegate[] dels = test.OnDelegate.GetInvocationList(); 
                for (int i = 0; i < dels.Length; i++) 
                {
                    test.OnDelegate -= dels[i] as MethodDelegate;
                }
            }
        }

威尼斯人平台 24

  4.委托的天性

  委托相仿于 C++ 函数指针,但它们是种类安全的。
  委托允许将艺术作为参数实行传递。
  委托可用于定义回调方法。
  委托可以链接在同步;比如,能够对叁个事件调用七个法子。
  方法不必与寄托具名完全合作。

  5.总结:

 
  
Delegate最少0个参数,至多31个参数,能够无重回值,也足以钦定重回值类型

  Func能够选用0个至16个传入参数,必需具备再次回到值

  Action能够选取0个至十五个传入参数,无重临值

  Predicate只可以接纳一个传出参数,重返值为bool类型

 

  详细参谋:

 

相关文章