1. 委托的定义和理解
在C#中,委托和class一样 ,是一种引用类型的数据类型,可以用来声明变量。使用的时候则需要创建实例。(关于委托对于引用类型的理解:表示对具有特定参数列表和返回类型的方法的引用)(不理解也没关系)
委托一般定义在命名空间中,和class一样, 也可以定义在类中,就是该类的属性。
java语言和c#语言都是c++语言发展而来,但是java语言为了安全性,不允许程序员直接访问地址,舍弃了与指针相关的东西,但是c#语言却通过委托来保留了与函数指针这部分对应的功能 。这也是为什么那么多人解释说委托可以理解为函数指针。
自己声明定义委托并使用
声明示例:
public delegate void MyDelegate(); //无返回值类型,无参数
public delegate string MyTest(string parm); //返回值 string类型,参数 string类型
写一个类,里面包含函数Method1,Method2 ,用来测试委托
public class DelegateTest
{
public void Method()
{
Console.WriteLine("这是没有返回值的方法!");
}
public string Method2(string name)
{
string result= "fanhuizhi" + name;
Console.WriteLine($"这是有返回值,有参数的方法,返回值为{result},传入的参数为{name}");
return result;
}
}
main函数中调用
测试结果
2. C#中常使用的委托和自定义委托
和class类相似,C#中有很多已经定义好的类,方便直接使用,比方说和线程相关的Task类,
关于委托,C#中也有已经定义好的,最常见的是Action和Func ,
Action委托 没有返回值类型; Func 委托,是泛型委托, <>中存放返回值类型
和上面自己定义一样,一般情况下最常用的有无返回值,以及参数个数有多少,基本上Action和Func都能满足,有自己的其它需求可以考虑自定义。
ACtion和Func的定义 ,仅做了解
F12查看 Action的定义 ,
Func的定义
注: public delegate TResult Func<out TResult>(); 其中TResult表示的是泛型参数,而out TResult表示可以输出泛型
解释 Func<out TResult>:
- public delegate:这是一个委托声明的开始,表明 Func 是一个委托类型。
- <TResult>:这是泛型类型参数的声明。TResult 是一个泛型参数,它代表委托返回值的类型。使用泛型参数可以让你定义一个可以返回任何类型结果的委托。
- out:在泛型委托或泛型方法中,out 关键字用于方法参数,表示该参数是输出参数,即方法执行完毕后,该参数会被赋予一个值。但在泛型类型参数声明中,out 关键字没有特殊含义,它只是类型参数的名称。
- Func<out TResult>():括号表示该委托可以绑定无参数的方法。
关于Func和Action的使用 示例:
1. Action 委托
public class Calculate
{
public void Report()
{
Console.WriteLine("there are three methods!");
}
public double Add(double a, double b)
{
Console.WriteLine("sum =" + (a + b));
return a + b;
}
public double Del(double a, double b)
{
Console.WriteLine("del =" + (a - b));
return a - b;
}
public double Method()
{
return 3;
}
public void Method1()
{
Console.WriteLine("委托函数测试1");
}
public void Method2()
{
Console.WriteLine("委托函数测试2");
}
public void Method3(double x)
{
Console.WriteLine($"输入的double类型参数为{x}");
}
}
测试,调用
测试结果
2. Func委托
测试结果:
3. 多播委托
测试结果
委托的很粗糙的 通过敲掉代码的方式理解这个概念, 至于一下问题,后续理解后再更细:
1. 既然可以用类的实例直接调用方法的方式实现方法的调用,为什么还需要使用委托?
2. 在什么情况下需要使用委托?
3.为什么说 委托是事件和回调函数的基础?