委托

1.什么是委托?

C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。

下面就定义一个委托,以及相应的两个方法。

public class DelegateTest
{

   public delegate int GetNum(int num1);//声明的这个委托方法可以委托所有1个int入参返回值为int的方法

  int num = 10;
  public int AddNum(int a)
  {
    num = a + num;
    return num;
  }

  public int LinkNum(int a)
  {
    num = a * num;
    return num;
  } 

//匿名委托
public string NiMingDelegate(int a ,int b)
{
return "返回的是" + (a + b);
}

}

static void Main(string[] args)
{

  DelegateTest delegateTest = new DelegateTest();

  DelegateTest.GetNum getNum1 = new DelegateTest.GetNum(delegateTest.AddNum);

  DelegateTest.GetNum getNum2 = new DelegateTest.GetNum(delegateTest.LinkNum);

  Console.WriteLine(getNum1(1));//11 这里不用多说10+1=11
  Console.WriteLine(getNum2(2));//22 这里不是10*2=20,而是11*2=22,可以理解成,DelegateTest里的num参数,先参与getNum1的计算值被修改成11,再参与getNum2中的计算,成了11*2

  //委托的多播

DelegateTest.GetNum getNumMore = getNum1;

getNumMore += getNum2;

Console.WriteLine(getNumMore(3));//75 这里是75,其实是 (3+22)*3=75,等于是把getNum1和getNum2在执行了一次

//当然,如果getNum1和getNum2,只是利用num参与计算,并没有对num赋值,就没这种效果,那getNumMore其实就是getNum2的值,是3*10=30。

//还可以匿名方法,这种就是把方法的定义部分省略了。
DelegateTest.GetNum getNum3 = delegate (int i)
{
return i;
};
Console.WriteLine(getNum3(1));
//还有更懒的匿名方式,关键字都省了,用lambda表达式
DelegateTest.GetNum getNum4 = (int i) => { return i; };
Console.WriteLine(getNum3(2));

//匿名委托Func,最后一个参数是返回值,参数数量为1~5
Func<int, int, string> Func1 = new Func<int, int, string>(delegateTest.NiMingDelegate);
Console.WriteLine(Func1(3, 6));
//也可以这么写,把new Func<int, int, string>省了,但是在编译时系统会自动加上...
Func1 = delegateTest.NiMingDelegate;
Console.WriteLine(Func1(3, 7));
//匿名委托Action action ,用法和Func一样,只是没有返回值,参数数量为0~4

}

Func示例:

定义一个方法用来演示Func,因为我引用这个方法的代码放在静态类里,所有这里加上了static关键字

public static string FuncTest(int paramA,string paramB)
        {
            return "Func演示";
        }

调用

 Func<int, string, string> func = new
                 Func<int, string, string>(FuncTest);
            string result =  func(1, "123");

Lamada写法更简单

Func<int, string, string> func2 = (paramA, paramB) => { return "Func演示"; };

 

Action示例:

其实就是没有返回值的Func

Action<int, string> action = (paramA, paramB) => {
               int paramC = paramA + 1;
            };

 

2.为什么要用委托?

  为什么不直接调用方法,而是要用委托,不是多此一举吗?其实不然,委托是c#最好的一个特性,它为后来的很多特性都打下了基础。委托使得一个方法可以作为另一个方法的参数进行传递,这就是委托最大的作用。  

public class DelegateTest
{

public delegate void GreetingDelegate(string name);
public void Greeting(string name, GreetingDelegate callback)
{
  callback(name);
}
public void EnglishGreeting(string name)
{
  Console.WriteLine("Hello, " + name);
}

public void ChineseGreeting(string name)
{
  Console.WriteLine("你好, " + name);
}

}

static void Main(string[] args)
{

delegateTest.Greeting("路人", delegateTest.ChineseGreeting);
delegateTest.Greeting("luy", delegateTest.EnglishGreeting);

}

这里就把ChineseGreeting和EnglishGreeting方法作为参数传递了。

 

posted @ 2019-08-03 19:22  luytest  阅读(260)  评论(0)    收藏  举报