委托的定义和声明
1、委托是一种存储函数引用的类型,关键字是delegate
2、委托的定义指定了一个返回类型和一个参数列表
namespace _004
{
//委托和函数的区别
//1、定义委托要加上关键字delegate
//2、委托不需要函数体
public delegate double MyDelegate(double param1, double param2);
class Program
{
static double Multiply(double param1,double param2)
{
return param1 * param2;
}
static double Divide(double param1,double param2)
{
return param1 / param2;
}
static void Main(string[] args)
{
MyDelegate de;//利用我们定义的委托类型声明了一个变量
MyDelegate MD;
MD = Divide;
de = Multiply;
Console.WriteLine( de(2.0, 555.46)+" "+MD(464,445));
Console.ReadKey();
}
}
}
委托
概念:委托是一个类型,这个类型可以赋值一个方法的引用
声明委托
在c#中使用委托需要两个阶段,首先定义委托,告诉编译器我们这个委托可以指向哪些类型的方法,然后创建该委托的实例,定义委托的语法如下:
delegate void IntMethodInvoker(int x)
表示定义一个委托叫做IntMethodInvoker,这个方法带有一个类型的参数,并且这个方法的返回值是void,定义一个委托要定义方法的参数和返回值,使用关键字delegate定义。
例:
class Program
{
private delegate string GetAString();//指向一个参数为空,返回值为String的方法
static void Main(){
int x=40;
GetAString firstStringMethod=new GetAString(x.ToString);//ToString表示把x的值转换成一个字符串a指向了x中的ToString方法
Console.WriteLine(firstStringMethod());
}
}
在这里我们首先使用GetAString委托声明了一个类型,叫做firstStringMethod,接下来使用new对他进行初始化,使他引用到x中的ToString方法上,这样firstStringMethod就相当于x.ToString,我们通过firstStringMethod()执行方法就相当于x.ToString()
class Program{
private delegate string GetAString();
static void Main(){
int x-40;
GetAString a=x.ToString;
string s=a.Invoke();//通过invoke方法调用a中所引用的方法
Console.WriteLine(s);
把委托类型当做参数使用
private delegate void PrintString();
static void PrintStr(PrintString print)
{
print();
}
static void Method1(){
Console.WriteLine("method1");
}
static void Method2(){
Console.WriteLine("method");
}
static void Main(){
PrintString method=Method1;
PrintStr(method);
method=Method2;
PrintStr(method);
Action委托
除了我们自己定义的委托外,系统还给我们提供了一个内置的委托类型,Action和Func
Action 是一个没有返回值和参数的委托。注:当我们需要定义一个没有返回值没有参数的委托时,可以直接调用Action委托,省去我们手动定义委托的麻烦
例:
class Program{
static void PrintString()
{
Console.WriteLine("Action委托");
}
static void Main(string[] args){
Action a=PrintString;//action委托是系统内置(预定义)的一个委托类型,他可以指向一个没有返回值没有参数的方法
}
}
Action也可以指向有参数但没有返回值的委托类型
例:
Action<int> a;//定义一个委托类型,这个类型可以指向一个没有返回值,有一个int参数的方法
class Program{
static void PrintInt(int i){
Console.writeLine("Hollo,Word");
}
static void Main(string[] args){
Action<int> a=PrintInt;
}
当有两个参数类型时
例:
static void PrintDoubleInt(int i1,int i2){
Console.WriteLine(i1+i2);
}
static void Main(string[] args)
{
Action<int,int> a=PrintDoubleInt;
a(22,12);//调用
}
Action最大支持16个参数
Func委托
Func引用了一个带有返回值的方法,他可以传递0或者多到16个参数类型和一个返回值类型
例:
class Program{
static int Test1()
{
return 1;
}
static void Main(string[] args)
{
Func<int> a=Test1;
Console.WriteLine(a());
}
}
例2:
class Program
{
static int Test2(string str)
{
Console.WriteLine(str);
return 100;
}
static void Main(string[] args)
{
Func<string,int> a=Test2;//后面的表示返回值类型,前面的表示参数类型
}
}
Function后面可以跟很多类型,最后一个类型时返回值类型,前面的类型时参数类型,参数类型必须跟指向的方法的参数类型按照顺序对应
Function后面必须指定一个返回值类型,参数类型可以有0-16个,先写参数类型,最后一个写返回值类型
多播委托
class Program{
static void Test1()
{
Console.WriteLine("text1");
}
static void Test2()
{
Console.WriteLine("test2");
}
static void Main(string[] args)
{
Action a=Test1;
a+=Test2;//表示添加一个委托的引用
a-=Test1;//表示去除一个委托的引用
a();
当一个委托没有指向任何方法的时候,调用的话会出现异常