委托一词在百度上面的解释是:托付给别的人或机构办理
顾名思义就是让别人给你办事,在C#中也是如此就是用此方法来做彼方法
声明一个委托
delegate [返回值类型] 委托名(传入的参数)
如public delegate void Delegate_Class1(string str);//声明一个委托带参没有返回值的委托
定义了一个没有返回值类型名字叫做Delegate_Class1且有一个string类型参数的委托(实际上定义一个委托是指定义一个新类)
定义好了委托就可以实例委托的对象了
使用委托
public class Delegate_Test//委托测试类
{
public static void PrintName(stringstr)//一个简单的控制台打印字符串的方法
{
Console.WriteLine(str);
}
}
Delegate_Class1 tr = Delegate_Test.PrintName;
下面来构造一个测试实例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication3
{
public delegate void Delegate_Class1(string str);//声明一个委托带参没有返回值的委托
public delegate int Delegate_Class2(int num1, int num2);//声明一个带两个参数且有返回值(int)的委托
public class Delegate_Test//委托测试类
{
public static void PrintName(string str)//一个简单的控制台打印字符串的方法
{
Console.WriteLine(str);
}
public static int ReturnNum(int op1, int op2)//一个简单的返回结果的方法
{
return op1 + op2;
}
}
class Program
{
static void Main(string[] args)
{
Delegate_Class1 tr = Delegate_Test.PrintName;//使用委托:写法一直接将方法名给实例化的委托实例
tr("小明");//执行委托写法一:直接用实例化的委托变量
tr.Invoke("小明");//执行委托写法二:使用实例化的委托变量的Invoke()方法
/*其中tr是委托类型的变量所以在实际执行时C#编译器会用tr.Invoke()来代替tr()*/
Delegate_Class1 tr1 = new Delegate_Class1(Delegate_Test.PrintName);//使用委托:写法二使用委托的构造函数
tr1("小华");
Delegate_Class2 it = new Delegate_Class2(Delegate_Test.ReturnNum);
int temp = 0;//声明一个临时变量用于保存委托返回的结果
temp = it(2, 4);//执行委托
Console.WriteLine(temp);//打印结果
}
}
}
上面的委托并没有体现委托的实际意义(没有委托,事情也同样能够完成),只是让大家粗略的了解什么是委托接下来要讲解的是委托的实际用处(没有委托就很难办成了)。
下面直接看实例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
public delegate double Get_Result(double num); //声明一个委托类
public class Math_Method//测试委托类
{
public static double Method1(double number)//测试方法一:接受一个值 返回这个值的2倍
{
return number * 2;
}
public static double Method2(double number)//测试方法二:接受一个值 返回这个值的平方
{
return number * number;
}
}
class Program
{
static void Main(string[] args)
{
/*操作委托类型的数组和普通的数组是一样的*/
Get_Result[] gr = new Get_Result[] //实例化委托数组
{
Math_Method.Method1,
Math_Method.Method2
};
Console.WriteLine(gr[0](12));//执行委托(方法一对应的是输出2倍)并打印结果
Console.WriteLine(gr[1](12));//执行委托(方法二对应的是输出平方)并打印结果
}
}
}
将上面的方法调用采用for循环来代替(开始体现委托价值的时候了)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
public delegate double Get_Result(double num); //声明一个委托类
public class Math_Method//测试委托类
{
public static double Method1(double number)//测试方法一:接受一个值 返回这个值的2倍
{
return number * 2;
}
public static double Method2(double number)//测试方法二:接受一个值 返回这个值的平方
{
return number * number;
}
}
class Program
{
static void Main(string[] args)
{
/*操作委托类型的数组和普通的数组是一样的*/
Get_Result[] gr = new Get_Result[] //实例化委托数组
{
Math_Method.Method1,
Math_Method.Method2
};
// Console.WriteLine(gr[0](12));//执行委托(方法一对应的是输出2倍)并打印结果
// Console.WriteLine(gr[1](12));//执行委托(方法二对应的是输出平方)并打印结果
for(int i=0;i<gr.Length;i++)//使用for循环来代替上面的语句
{
Console.WriteLine(gr[i](12));
}
}
}
}
接下来开始讲解Action<T>和Func<T>委托(体现委托强大的时候了)
除了为每个参数和返回类型定义一个新的委托类型之外,还可以使用Action<T>和Func<T>委托,泛型Action<T>委托表示引用一个void返回类型的方法。这个委托泪存在不同的变体,可以传递至多16种不同的参数类型。Func<T>和Action<T>非常的类似Func<T>也可以有很多的变体但是Func<T>允许调用带返回类型的方法。
Action<in T0,in T1>表示传入两个参数
如Action<double,double>表示传入两个double类型的参数
Func<in T,out TResult>表示一个传入参数 一个返回参数
如Func<double,double>表示传入一个double类型的参数 返回一个double类型的参数
接下来将要把上面的实例用Func<T>来改写
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
//当前将声明的委托注释掉 下面使用Func<T>来代替
//public delegate double Get_Result(double num); //声明一个委托类
public class Math_Method//测试委托类
{
public static double Method1(double number)//测试方法一:接受一个值 返回这个值的2倍
{
return number * 2;
}
public static double Method2(double number)//测试方法二:接受一个值 返回这个值的平方
{
return number * number;
}
}
class Program
{
static void Main(string[] args)
{
/*操作委托类型的数组和普通的数组是一样的*/
//Get_Result[] gr = new Get_Result[] //实例化委托数组
//{
// Math_Method.Method1,
// Math_Method.Method2
//};
//将上面的方法用Func<T>进行改写
Func<double, double>[] gr =
{
Math_Method.Method1,
Math_Method.Method2
};
// Console.WriteLine(gr[0](12));//执行委托(方法一对应的是输出2倍)并打印结果
// Console.WriteLine(gr[1](12));//执行委托(方法二对应的是输出平方)并打印结果
for (int i = 0; i < gr.Length; i++)//使用for循环来代替上面的语句
{
Console.WriteLine(gr[i](12));
}
}
}
}
结合上面讲述的内容来做一个实例, 一次性搞定两个数的四则运算(自己想的) 废话不说直接上代码,有什么不懂的点 欢迎留言。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Delegate_Calcu
{
public delegate string Math_Opertion(double num1, double num2);//声明一个委托类
public class Calculator
{
public static string Calculate_Add(double op1, double op2)//加
{
return "两个数相加的结果:" + (op1 + op2);
}
public static string Calculate_Subtract(double op1, double op2)//减
{
return "两个数相减的结果:" + (op1 - op2);
}
public static string Calculate_Multiply(double op1, double op2)//乘
{
return "两个数相乘的结果:" + (op1 * op2);
}
public static string Calculate_Divide(double op1, double op2)//除
{
return "两个数相除的结果:" + (op1 / op2);
}
}
class Program
{
static void Main(string[] args)
{
Math_Opertion[] mo = new Math_Opertion[]//实例化委托数组
{
Calculator.Calculate_Add,
Calculator.Calculate_Subtract,
Calculator.Calculate_Multiply,
Calculator.Calculate_Divide
};
Console.WriteLine("请输入需要计算的第一个数:");
double num1 = double.Parse(Console.ReadLine());//输入第一个数
Console.WriteLine("请输入需要计算的第二个数:");
double num2 = double.Parse(Console.ReadLine());//输入第二个数
for (int i = 0; i < mo.Length; i++)
{
Console.WriteLine(mo[i](num1, num2));//循环遍历结果
}
}
}
}
程序运行的结果如下
接下来 将讲解多播 委托 敬请期待...
未完 待续...