为了实现方法的参数化,提出了委托的概念,委托是一种引用方法的类型,即委托是方法的引用,一旦为委托分配了方法,委托将与该方法具有完全相同的行为;另外,.NET中为了简化委托方法的定义,提出了匿名方法的概念。
一、委托
C#中的委托(Delegate)是一种引用类型,该引用类型与其他引用类型有所不同,在委托对象的引用中存放的不是对数据的引用,而是存放对方法的引用,即在委托的内部包含一个指向某个方法的指针。通过使用委托把方法的引用封装在委托对象中,然后将委托对象传递给调用引用方法的代码。
[修饰符] delegate[返回类型] [委托名称]([参数列表])
其中:
[修饰符]是可选项;
[返回值类型]、关键字delegate和[委托名称]是必需项;
[参数列表]是可选项,用来指定委托所匹配的方法的参数列表。
一个与委托类型相匹配的方法必需满足以下两个条件:
☑ 这二者具有相同的签名,即具有相同的参数数目,并且类型相同,顺序相同,参数的修饰符也相同。
☑ 这二者具有相同的返回值类型
委托是方法的类型安全的引用,之所以说委托是安全的,是因为委托和其他所有的C#成员一样,是一种数据类型,并且任何委托对象都是System.Delegate的某个派生类的一个对象。
//一个合法的委托定义
delegate void DelOutput(string s);
1.委托的实例化
在声明委托后就可以创建委托对象,即实例化。实例化委托的过程就是将委托与特定的方法进行关联的过程。
早期的VS,委托对象要使用new关键字创建。VS2022提供用更简单易懂的方法创建委托对象,直接用方法名赋值给委托对象。
//创建委托对象,其中DelOutput是委托名
DelOutput del = Console.WriteLine; //创建委托对象,直接指向Console.WriteLine
del("del()就是Console.WriteLine()"); //委托对象调用方法
del.Invoke("匿名方法被调用"); //委托调用匿名方法
del = NamedMethod; //修改委托对象指向方法NamedMethod
del("命名方法被调用"); //委托对象调用命名方法
2.委托的调用
创建并实例化委托对象后,就可以用该委托代替方法并执行与方法。
3.示例
// 委托
namespace _08_1
{
delegate void MyDelegate(string s);
public class MyClass
{
static void Method(string s)
{
Console.WriteLine(s);
}
public static void Method1(string s)
{
Console.WriteLine(s);
}
static void Main(string[] args)
{
MyDelegate my = new(Method); //用方法直接创建实例,可选new
my("江山如此多娇"); //委托调用
MyDelegate mydel = Method; //用方法直接创建实例,不选new
mydel("沁园春.雪"); //委托调用
mydel = Method1; //用另一个方法直接修改实例
mydel("万里雪飘"); //委托调用
}
}
}
//运行结果:
/*江山如此多娇
沁园春.雪
万里雪飘 */
二、匿名方法
为了简化委托的可操作性,在C#语言中,提出了匿名方法的概念,它在一定程度上降低了代码量,并简化了委托引用方法的过程。
匿名方法允许一个与委托关联的代码被内联地写入使用委托的位置,这使得代码对于委托的实例很接。除了这种便利之外,匿名方法还共享了对本地语句包含的函数成员的访问。
匿名方法是C#2.0引入的一个新特性,它允许开发者内联(inline)声明自己的函数代码而无须使用委托函数(delegate)。
当我们需要一个函数,但又懒得去命名它的时候,就可以使用匿名方法。在 C# 中, 匿名方法通常表现为使用 delegate 运算符和 Lambda 表达式。
匿名方法使用场合:
1. 需要一个临时方法,该方法使用次数极少;
2. 这个方法的代码很短,甚至可能比方法声明都短的情况下;
//匿名方法的语法格式:
delegate([参数列表])
{
[代码块]
}
// 委托和匿名方法
namespace Demo
{
delegate void DelOutput(string s); //自定义委托类型,名称DelOutput
class Program
{
static void NamedMethod(string k) //命名方法
{
Console.WriteLine(k);
}
static void Main(string[] args)
{
DelOutput del = Console.WriteLine; //委托的引用指向Console.WriteLine
del("del()就是Console.WriteLine()");
del.Invoke("匿名方法被调用"); //委托对象del调用匿名方法,委托也可调用匿名方法
Console.Write("n");
del = NamedMethod; //委托绑定到命名方法NamedMethod
del("命名方法被调用"); //委托对象del调用命名方法
Console.ReadLine();
}
}
}
/*del()就是Console.WriteLine()
匿名方法被调用
命名方法被调用 */
原文地址:https://blog.csdn.net/wenchm/article/details/134551049
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_7207.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!