C# 委托( delegate )

一 环境

  • Windows 10;
  • Visual Studio 2017;
  • 项目一个,名为“Ex02“,(控制台应用程序 . net framework 4.6.1)

二 非委托模式

1. 项目中添加 Calculate.cs 文件,代码如下:

public class Calculate
{
	/// <summary>
	/// 方法:两位数求和
	/// </summary>
	/// <param name="x">被加数</param>
	/// <param name="y">加数</param>
	/// <returns></returns>
	public int Add(int x, int y)
	{
		return x + y;
	}
}

2. 项目 Program.cs 文件,代码如下:

class Program
{
	static void Main(string[] args)
	{
		Calculate myCalculate = new Calculate();
		Console.WriteLine(myCalculate.Add(2,3));
		Console.ReadKey();
	}
}

3. 运行项目,输出结果为 5 ,正常。

三 委托书写模式一 | 教科书模式

1. 修改 Calculate.cs 文件代码如下:

// step01:声明一个名为 CalculateDelegate 的委托,
// 该行代码写到 Calculate.cs 文件中也行,写到项目中其他 cs 文件中也行。
public delegate int CalculateDelegate(int x, int y);

public class Calculate
{
	/// <summary>
	/// 方法:两位数求和
	/// </summary>
	/// <param name="x">被加数</param>
	/// <param name="y">加数</param>
	/// <returns></returns>
	public int Add(int x, int y)
	{
		return x + y;
	}
	/// <summary>
	/// 方法:两位数相减
	/// </summary>
	/// <param name="x">被减数</param>
	/// <param name="y">减数</param>
	/// <returns></returns>
	public int Minus(int x, int y)
	{
		return x - y;
	}
}

2. 修改 Program.cs 文件代码如下:

class Program
{
	static void Main(string[] args)
	{			
		Calculate myCalculate = new Calculate();

		//step02-01:引用委托,将实例化类的 Add 方法作为参数
		CalculateDelegate myCD = new CalculateDelegate(myCalculate.Add);
		Console.WriteLine(myCD(2, 3));   //结果为 5
		//step02-02:重置委托,将实例化类的 Minus 方法作为参数
		myCD = new CalculateDelegate(myCalculate.Minus);
		Console.WriteLine(myCD(2, 3));   //结果为 -1
		Console.ReadKey();
	}
}

四 委托书写模式二 | 匿名方法

Calculate.cs 文件代码不变,将 Program.cs 文件代码修改如下:

class Program
{
	static void Main(string[] args)
	{			
		Calculate myCalculate = new Calculate();
		//step02-11:定义委托参数形式,并把对应的方法与委托关联,这里将 Caculate.Add(x,y) 方法进行了关联
		CalculateDelegate myCD = delegate (int a, int b) { return myCalculate.Add(a, b); };
		Console.WriteLine(myCD(2, 3));  //结果为 5
		//step02-12:将委托重置,将 Caculate.Minus(x,y) 方法进行了关联
		myCD = delegate (int x, int y) { return myCalculate.Minus(x, y); };
		Console.WriteLine(myCD(2, 3));  //结果为 -1

		Console.ReadKey();
	}
}

五 委托书写模式三 | Lambda 表达式

Program.cs 文件代码修改如下:

class Program
{
	static void Main(string[] args)
	{			
		Calculate myCalculate = new Calculate();
		//step02-21:Lambda 方法一,定义委托参数形式,并把对应的方法与委托关联,
		//这里将 Caculate.Add 方法进行了关联
		CalculateDelegate myCD = (int a, int b) => { return myCalculate.Add(a, b); };
		Console.WriteLine(myCD(2, 3));  //结果为 5
		//step02-22:Lambda 方法一,将委托重置,将 Caculate.Minus 方法进行了关联
		myCD = (int x, int y) => { return myCalculate.Minus(x, y); };
		Console.WriteLine(myCD(2, 3));  //结果为 -1

		//step02-03:Lambda 方法二,将 step02-21 书写方式简化
		myCD = (x, y) => { return myCalculate.Add(x, y); };
		Console.WriteLine(myCD(3, 4));  //结果为 7

		//step02-04:Lambda 方法三,将 step02-03 书写方式更为简化
		myCD = (x, y) => myCalculate.Add(x, y);
		Console.WriteLine(myCD(3, 4));  //结果为 7

		Console.ReadKey();
	}
}

六 委托书写模式四 | 泛型委托书写模式

Calculate.cs 文件中委托声明删掉(或注释掉),将 Program.cs 文件代码修改如下:

class Program
{
	static void Main(string[] args)
	{			
		Calculate myCalculate = new Calculate();
		//step02-41:泛型委托 + Lambda 方法一,这里将 Caculate.Add 方法进行了关联
		Func<int,int,int> myCD = (int a, int b) => { return myCalculate.Add(a, b); };
		Console.WriteLine(myCD(2, 3));  //结果为 5

		//step02-42:泛型委托 + Lambda 方法二,将 Caculate.Minus 方法进行了关联,简化了花括号
		 Func<int,int,int>	myCD1 = (int x, int y) => myCalculate.Minus(x, y);
		Console.WriteLine(myCD1(2, 3));  //结果为 -1

		//step02-43:泛型委托 + Lambda 方法三,将 step02-42 书写方式更简化
		Func<int,int,int> myCD3 = (x, y) => myCalculate.Add(x, y);
		Console.WriteLine(myCD3(3,4));  //结果为 7

		Console.ReadKey();
	}
}

七 小结

委托的书写方式变化很多,上述二至五都需要委托声明和应用两步,到了六(泛型委托),委托声明部分都可以省略,直接应用。

猜你喜欢

转载自my.oschina.net/primates/blog/1618465