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();
        }

  执行结果为

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Esofar 开发日记

C#基础篇 - 理解委托和事件

委托类似于C++中的函数指针(一个指向内存位置的指针)。委托是C#中类型安全的,可以订阅一个或多个具有相同签名方法的函数指针。简单理解,委托是一种可以把函数当做...

13930
来自专栏蘑菇先生的技术笔记

c#语言-高阶函数

34360
来自专栏GreenLeaves

C# 高效率创建字符串类(StringBuilder)

因为String类型代表不可变字符串,所以无法对当前String类型实例进行处理.所以FCL提供了System.Text.StringBuilder类型,它可以...

10730
来自专栏DOTNET

C#要点

内容摘要 1 数据类型   1.1表达范围问题   1.2 数组的长度问题   1.3 值类型与引用类型   1.4 匿名类型与隐式类型   1.5硬编码造成的...

29050
来自专栏大前端_Web

C#中值类型和引用类型及类型的转换

版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/articl...

49060
来自专栏草根专栏

C# 7.0简而言之 -- 02. C#基础 (1)

语句1里面计算了表达式(expression) 12 * 30, 并把结果保存到了本地变量x里面, x是整型类型.

396120
来自专栏Jackson0714

不惧面试:委托

359130
来自专栏林德熙的博客

C# 循环的判断会进来几次

最近有小伙伴告诉我,在循环的判断条件只会计算一次,本金鱼不相信,于是就做了测试,本文记录我做的测试。

13030
来自专栏python成长之路

lambda函数常见用法

18550
来自专栏WindCoder

Java中的域与变量

Java中的Field译为“字段”,也译为“域”,Field和成员变量(Member Variable)是相同的。所以域是变量中的一种。

57210

扫码关注云+社区

领取腾讯云代金券