本文介绍: 为了实现方法参数化,提出了委托概念委托是一种引用方法类型,即委托方法引用,一旦为委托分配了方法,委托将与该方法具有完全相同的行为;另外,.NET中为了简化委托方法的定义,提出了匿名方法的概念

目录

一、委托

1.委托的实例化

2.委托的调用

3.示例

二、匿名方法


        为了实现方法的参数化,提出了委托的概念,委托是一种引用方法的类型,即委托是方法的引用,一旦为委托分配了方法,委托将与该方法具有完全相同的行为;另外,.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进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注