C#委托四(匿名方法)

简介: 什么是匿名方法? 匿名方法是C#2.0引入的一个新特性,它允许开发者声明自己的函数代码而无须使用委托函数。 C#为委托提供一种机制,可以为委托定义匿名方法,匿名方法没有名称,编译器会定指定一个名称,匿名方法中不能使用跳转语句跳转到该匿名方法的外部,也不能跳转到该方法的内部。

什么是匿名方法?
 
匿名方法是C#2.0引入的一个新特性,它允许开发者声明自己的函数代码而无须使用委托函数。
 
C#为委托提供一种机制,可以为委托定义匿名方法,匿名方法没有名称,编译器会定指定一个名称,匿名方法中不能使用跳转语句跳转到该匿名方法的外部,也不能跳转到该方法的内部。也不能在匿名方法外部使用的ref和out参数。
 
通过使用匿名方法,可以不必创建单独的方法,因此减少了实例化委托所需的编码系统开销。例如,如果创建方法所需的系统开销是不必要的,则指定代码块(而不是委托)可能非常有用。

什么时候该使用匿名方法
 
1.需要一个临时方法,该方法使用次数极少;
 
2.这个方法的代码很短,甚至可能比方法声明都短的情况下使用。

下面看一下简单的小例子:

    class Program
    {

        static void MethodTest(string Test)
        {
            Console.WriteLine("简单方法执行!");
        }

        /// <summary>
        /// 声明一个委托,用于实现多播操作
        /// </summary>
        /// <param name="Test"></param>
        delegate void MyMulticastDelegate(string Test);

        static void Main(string[] args)
        {
            MyMulticastDelegate MyFirst = new MyMulticastDelegate(MethodTest);
            MyMulticastDelegate multicastDelegate = MyFirst;
            multicastDelegate("Test");

       ///////////////////////////////////////////////////////         
string Test = "test"; MyMulticastDelegate md = new MyMulticastDelegate( delegate(string Test1) { Console.WriteLine("简单方法执行!"); } ); md(Test); Console.Read(); } }

  通过上面代码可以看到,上面是通过委托实现方法调用的,下面的就是通过匿名方法实现的。

查看执行后的效果:

C#3.0之后匿名方法可以使用λ表达式来进行定义
 
无论是拉姆达(lambda)表达式(匿名函数、是匿名类) ,都能归属到一种叫闭包的东西上面。
 
左边是参数,使用括号表达 (string param),可以是 (param)这样不定义类型,编译器会推断出来,只有一个参数的时候可以不使用括号。右边是实现代码,使用花括号,如果代码只有一行,则不使用花括号和return关键字也可以,编译器会为我们添加。
 
这是λ表达式的简单实现↓

        /// <summary>
        /// 声明一个委托,用于实现多播操作
        /// </summary>
        /// <param name="Test"></param>
        delegate string MyMulticastDelegate(string Test);

        static void Main(string[] args)
        {
            string str1 = "Test1";
            string str2 = "Test2";
            MyMulticastDelegate my = param => param + str1 + str2;
            MyMulticastDelegate my2 = (string param) => { return param + str1 + str2; };
            Console.WriteLine(my("Test"));
            Console.WriteLine(my2("aaaa"));
            Console.Read();
        }

  执行结果为

目录
相关文章
|
1月前
|
Java 调度 C#
C#学习系列相关之多线程(一)----常用多线程方法总结
C#学习系列相关之多线程(一)----常用多线程方法总结
|
1月前
|
C#
C#学习相关系列之数组---常用方法使用(二)
C#学习相关系列之数组---常用方法使用(二)
|
1月前
|
存储 C# 数据库
C# 生成唯一ID,有哪些方法?
【2月更文挑战第12天】
169 0
|
3月前
|
编译器 C# 开发者
C# 11.0中的新特性:覆盖默认接口方法
C# 11.0进一步增强了接口的灵活性,引入了覆盖默认接口方法的能力。这一新特性允许类在实现接口时,不仅可以提供接口中未实现的方法的具体实现,还可以覆盖接口中定义的默认方法实现。本文将详细介绍C# 11.0中接口默认方法覆盖的工作原理、使用场景及其对现有代码的影响,帮助开发者更好地理解和应用这一新功能。
|
3月前
|
安全 C# 开发者
C#中的默认接口方法:接口演化的新篇章
【1月更文挑战第11天】本文探讨了C# 8.0中引入的默认接口方法,这一特性允许在接口中定义具有默认实现的方法。文章介绍了默认接口方法的语法、使用场景,以及它们如何影响接口的设计和实现,同时讨论了默认接口方法带来的好处和潜在的陷阱。
|
4月前
|
缓存 C#
C# 操作路径(Path)类方法的使用与解析运行实例
C# 操作路径(Path)类方法的使用与解析运行实例
|
1月前
|
C#
C#学习相关系列之数据类型类----嵌套类和嵌套方法(三)
C#学习相关系列之数据类型类----嵌套类和嵌套方法(三)
|
1月前
|
开发框架 .NET C#
C#学习相关系列之Linq常用方法---排序(一)
C#学习相关系列之Linq常用方法---排序(一)
|
1月前
|
开发框架 .NET 编译器
C#学习相关系列之匿名方法和Lambda表达式
C#学习相关系列之匿名方法和Lambda表达式
|
1月前
|
C#
C#中保留小数点后N位的方法_kaic
C#中保留小数点后N位的方法_kaic