委托的使用案例

一、使用Func定义或Action


     //定义一个方法,此方法将被做为一个delegate对象,以参数形式传递给另一个方法
        private int sqare(int x)
        {
            return x * x;
        }

        //定义一个方法,并将Func这个特定委托作为一个参数
        private  void getSqare(Func<int,int> dlgt)
        {
            var i=int.Parse(this.textBox2.Text);
            this.textBox1.Text = dlgt(i).ToString();
        }
        //调用方法,并将定义的第一个方法作为第二个方法的参数
       private void button1_Click(object sender, EventArgs e)
        {
            this.getSqare(sqare);
        }

要点:Func<int,int>是一个特定委托写法,它的签名为:

    public delegate TResult Func<in T, out TResult>(T arg);

最后一个参数是返回值,前面最多可以有16个T型参数,
private void getSqare(Func<int,int> dlgt) 定义了传给本方法的方法参数,必须可以接收一个Int参数,返回一个int结果
这种委托的用法,必须有两个方法,一个调用,一个被调用,然后还要在其它地方开始两个方法的结合调用

但可以用Lambda表达式改写一下,减少一个方法

 //定义一个方法,并将Func这个特定委托作为一个参数
        private void getSqare(Func<int, int> dlgt)
        {
            var i = int.Parse(this.textBox2.Text);
            this.textBox1.Text = dlgt(i).ToString();
        }            
        private void button1_Click(object sender, EventArgs e)
        {
            this.getSqare(x=>x*x);
        }

即在调用含方法参数的方法时,直接将一个lambda表达式作为一个方法代入进去

Action与Func的区别只在于有没有返回值

二、直接声明委托

        //声明委托形式,即明确参数与返回值
        public delegate int dlgt(int i);       
        //写一个与委托形式相当的方法
        private int sqare(int x)
        {
           return x * x;
        }
        //写一个以委托为参数的方法 
        private void getSqare(dlgt dl)
        {
            var i = int.Parse(this.textBox2.Text);
            this.textBox1.Text = dl(i).ToString();
        }
      
       //调用上面的委托为参数的方法
	...
      dlgt dl1 = new dlgt(sqare); //实例化一个委托
      getSqare(dl1);              //调用方法,并将委托传入
    ...

同样也可以把委托用lambda简化一下(此处的lambda用了一个复杂形式,注意语法)

      public delegate int dlgt(int i); 
      private void getSqare(dlgt dl)
     {
            var i = int.Parse(this.textBox2.Text);
            this.textBox1.Text = dl(i).ToString();
     }
     //调用方法
    ...
      dlgt dl1 = new dlgt(x=> { if (x > 10) x = 10; return x * x;  });
      getSqare(dl1);              //调用方法,并将委托传入
    ...     

总结:1、定义委托,明确输入输出类型。2、写一个使用了此委托为参数并在其中用了此委托的方法。3、使用此方法,并将实例化后的委托(可以是一个方法也可以是一个lambda)作为参数传给它

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值