一 环境
- 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();
}
}
七 小结
委托的书写方式变化很多,上述二至五都需要委托声明和应用两步,到了六(泛型委托),委托声明部分都可以省略,直接应用。