C#中委托和匿名方法

目录

一、委托

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()
匿名方法被调用

命名方法被调用 */

你可能感兴趣的:(c#,开发语言)