c#委托详解

 

(1)C#共有3种内置泛型委托

(2)委托概念

 1.委托的特点

  委托类似于 C++ 函数指针,但它们是类型安全的。
  委托允许将方法作为参数进行传递。
  委托可用于定义回调方法。
  委托可以链接在一起;例如,可以对一个事件调用多个方法。
  方法不必与委托签名完全匹配。

delegate类能够拥有一个签名(signature),并且它"只能持有与它的签名相匹配的方法的引用"。它所实现的功能与C/C++中的函数指针十分相似

  2.总结:

:无返回值的委托,你给它注册多少个方法,它就执行多少个方法,而有返回值的委托,同样注册多少个方法就执行多少个方法,但返回的是最后一个方法的返回值。

    Delegate至少0个参数,至多16个参数,可以无返回值,也可以指定返回值类型

  Func可以接受0个至16个传入参数,必须具有返回值

  Action可以接受0个至16个传入参数,无返回值

  Predicate只能接受一个传入参数,返回值为bool类型

 

 

  class Test
    {
        delegate void DelegateTest(string s);
   //声明一个委托
        delegate void MyDel(int n, int m);
        
        public static void ActionTest(Object i) {

            Console.WriteLine(i);
        }
        public static  int  FuncTest(int i)
        {

            return i;
             
        }
        static bool Compair(int z)
        {

            return z >10;
        
        }
        public static void HellowChinese(string strChinese)
        {
            Console.WriteLine("Good morning," + strChinese);
        }
        static void Main(string[] args)
        {
  #region 使用匿名方法
            MyDel del = delegate(int m, int n)
            {
                Console.Write(m - n + " ");
            };
            Console.WriteLine("准备好了哦,要开始调用委托了哦!");

            for (int i = 0; i < 10; i++)
            {
                del(i, 1);
            }
            #endregion
   #region 在编译器无法推断输入类型时可以显式指定类型,
            Func<int, string, bool> isTooLong = (int x, string s) => s.Length > x;
            Console.WriteLine(isTooLong(1,"212"));
            #endregion 
            // 
            #region  delegate委托
            DelegateTest dt = new DelegateTest(HellowChinese);
            dt("cz");//输出结果:Good morning,cz
            //
             
            #endregion

             

            //委托提供了一种可以直接访问类中方法的途径,可以将方法当作一个参数传递从而使用。

            #region 使用Action委托传递方法
            string mes = "w";
            int ss = 0;
          // 实例化   
            Action<Object> d = ActionTest;
            d(mes);//输出w
            d(ss);//输出0
            
            #endregion


            #region 使用Func委托传递方法-C#共有3种内置泛型委托

            Func<int,int> f = FuncTest;
            Console.WriteLine("fun方法"+f(12));

            #endregion

                

            #region 有参数无返回值
            Action<int> a3 = (x) => Console.WriteLine(x);
            a3(1);
            #endregion

            #region 无参数有返回值的情况
            Func<int> e1 = () => 100;
            var value1 = e1();
            Console.WriteLine(value1);//输出为100
            #endregion


            //Func委托有返回值,Action委托没有返回值。
            //   Func<int,int> 最后一个泛型是返回值的类型,前面的类型为输入类型,
              
            #region 有参数有返回值的情况,
            int value2 = 0;
            // 最后一个泛型是返回值的类型
            Func<int,int> e2 = (x) =>{      
            return  value2 = x + 1;
            };        
            Console.WriteLine(e2(6));

              
            // 多参数情况
            Func<int, int,int> e3 = (x,x2) => x+x2 + 1;
            int value3 = e3(1,2);
            Console.WriteLine(value3);
            #endregion

            #region Predicate:此委托返回一个bool值,该委托通常引用一个"判断条件函数"。---不用在<>中注明返回类型bool类型。
            // 其实Predicate可以用Func返回值是bool来代替的。
            Predicate<int> p = (x) => x > 0;
            bool value4 = p(1);
            Console.WriteLine(value4);//输出为:True。
            #endregion

            #region Predicate委托传递一个方法--Predicate有且只有一个参数,返回值固定为bool

            Predicate<int> pt=Compair;
            Console.WriteLine(pt(1));//false

            //和lambda表达式放在一起用
            Predicate<int> ps = s => s == 12;
            Console.WriteLine(ps(1));//false

            #endregion 

            Console.Read();
        }
    }

(3)多播委托

也可以说是合并委托,你可以使用 + 或者 += 将多个委托对象中的列表进行组合。在调用多播委托的同时,调用的顺序会依照调用列表中的顺序。需要注意的是,在合并的同时只能合并相同类型的委托。可以使用 - 和 -= 从多播委托中移除一个方法或方法列表。

   #region  Lambda表达式创建委托

            MyDel del4 = () =>
             {
                 Console.WriteLine("    {nameof(Print)}...");
             };
            del4();
            TestDel del5 = (x, y) =>
            {
                Console.WriteLine("{0}+{1}={2}", x, y, x + y);
            };
            del5(1, 2);//输出为1+2=3;
            Console.Read();

            #endregion

 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值