C#,委托

1,委托

  当要把方法传送给其他方法时,就需要使用委托。委托时一种特殊类型的对象,和其他对象不同的是,以前定义的所有对象都包含数据,而委托包含的只是一个或多个方法的地址。

2,委托的申明

  委托的申明如下

public delegate void IntMethodInvoker(int x);

这个例子中,申明了一个委托IntMethodInvoker,并指定该委托的每个实例都可以包含一个方法的引用,该方法带有一个int参数,并返回void。“定义一个委托”是指“定义一个新类”。委托实现为派生自基类System.MulticastDelegate的类,System.MulticastDelegate又派生自System.Delegate。

3,使用委托

  下面是一个简单使用委托的例子

private delegate string GetAString();
public static void Main()
{
  int x=40;
  GetAString firstStringMethod=new GetAString(x.ToString);
  WriteLine($"String is {firstStringMethod()}");
]

  这段代码,实例化类型为GetAString的委托,并对它进行初始化,使其引用整型变量x的ToString()方法。也可以使用委托推断,只传送地址的名称,可以简写为

GetAString firstStringMethod=x.ToString;

  首先定义一个类MathOperations,他有两个静态方法,对double类型的数据执行两种操作。

class MathOperations
{
  public static double MultiplyByTwo(double value)=>value*2;
  public static double Square(double value)=>value*value;
}

下面使用委托来调用这些方法。

using static System.Console;
namespace Wrox.ProCSharp.Delegates
{
  delegate double DoubleOp(double x);
  class void Main()
  {
    DoubleOp[] operations =
    {
      MathOperations.MultiplyByTwo,
      MathOperations.Square
    };
    for(int i=0;i<operations.Length;i++)
    {
      WriteLine(($"Using operation[{i}]:");
      ProcessAndDisplyNumber(operations[i], 2.0);
      ProcessAndDisplyNumber(operations[i], 2.0);
      ProcessAndDisplyNumber(operations[i], 2.0);
      WriteLine();
    }
   }
   static void ProcessAndDisplyNumber(DoubleOp action,double value)
   {
     double result = action(value);
   }

  在这个例子中,先申明了委托DoubleOp,这个委托可以引用这样一类方法,只有一个double类型的参数,返回double类型的返回值。 在class Main中定义了委托的数组,委托作为一种类型,也可以定义委托的数组,数组中包含两个委托,一个委托引用MathOperations.MultiplyByTwo方法,另一个委托引用MathOperations.Square方法。ProcessAndDisplyNumber方法有两个参数,第一个参数是 一个委托,第二个是一个double类型的参数,在中国函数内部,使用了委托action(value)。

4,泛型委托Action<T>和Func<T>委托

  泛型Action<T>委托表示引用一个void返回类型的方法,这个委托存在不同的变体,可以传递至多16种不同的参数的方法,Action<int T>调用带有一个参数的方法,Action<int T1,int T2>调用带有两个参数的方法。

  泛型Func<T>委托可以有类似的方法,Func<T>允许调用带有返回类型的方法,Func<T>也定义了不同的变体,可以最多传递16个参数类型和一个返回类型。Func<int,out TResult>调用带一个参数的方法。

5,匿名方法

  匿名方法的使用减少了要编写的代码,不用定义仅由委托定义的方法,下面是用匿名委托定义委托的例子。

        using static System.Console;
        using System;
        namespace Wrox.ProCSharp.Delegates
        {
          class Program
          {
            static void Main()
            {
              string mid = ", middle part, ";
              Func<string, string> anonDel = delegate(string param)
              {
                param += mid;
                param += " and this was added to the string.";
                return param;
              };
              WriteLine(anonDel("Start of string"));
            }
          }
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值