最新消息:把Logo换了一下,虽然丑了点,但至少完全是自己的设计

C#中匿名方法和Lambda表达式的使用

CSharp 宇托 198浏览 暂无评论

在C#中,匿名方法和Lambda方法,应该说是差不多的概念,都是做为内部函数使用的,虽然两者写法上有很大的区别。

匿名方法和Lambda方法做为同一概念,要注意以下几点:

  • 两者都不能访问定义方法中的refout参数
  • 两者都可以访问外部方法中的本地变量,并能修改外部方法中的值
  • 两者都可以访问外部类作用域的实例变量(或者静态变量)
  • 两者中的本地变量不能外部方法中的本地变量重名
  • 两者中的本地变量可以外部类作用域的实例变量重名

另外,关于Lambda方法的写法有下面两个要注意的地方。

  • 当Lambda方法是单语句时,不需要大括号和return(有返回值时),该单语句的执行结果就是返回值。
  • 当Lambda方法是多语句时,必须有大括号和return(有返回值时)。

测试代码如下:

C#
using System;

namespace StudyCSharp
{
    public delegate void ActionFunc(string value);

    class Program
    {
        public static string StaticValue = "StaticValue";
        public string Value = "Value";

        public void Test(ref string testRef, out string testOut)
        {
            testOut = "testOut";
            string innerVal = "innerVal";

            ActionFunc delegateFunc = delegate(string s) { Console.WriteLine("delegateFunc:" + s + innerVal + StaticValue + Value); };
            delegateFunc("delegateFunc");

            ActionFunc lambdaFunc = (s) => Console.WriteLine("lambdaFunc:" + s + innerVal + StaticValue + Value);
            lambdaFunc("lambdaFunc");
            // 编译出错:匿名方法访问ref变量
            // ActionFunc delegateFunc1 = delegate(string s) { Console.WriteLine("delegateFunc:" + s + testRef); };
            // 编译出错:匿名方法访问out变量
            // ActionFunc delegateFunc2 = delegate(string s) { Console.WriteLine("delegateFunc:" + s + testOut); };
            // 编译出错:匿名方法内本地变量与外部方法本地变量同名
            // ActionFunc delegateFunc3 = delegate(string s) { string innerVal = "innerVal"; Console.WriteLine("delegateFunc:" + s + innerVal); };
            // 编译出错:Lambda方法访问ref变量
            // ActionFunc lambdaFunc1 = (s) => Console.WriteLine("lambdaFunc:" + s + testRef);
            // 编译出错:Lambda方法访问out变量
            // ActionFunc lambdaFunc2 = (s) => Console.WriteLine("lambdaFunc:" + s + testOut);
            // 编译出错:Lambda方法内本地变量与外部方法本地变量同名
            // ActionFunc lambdaFunc3 = (s) => { string innerVal = "innerVal"; Console.WriteLine("lambdaFunc:" + s + innerVal); };

            // 单语句Lambda方法写法
            Func<int, int> lambdaFunc4 = (i) => i + 1;
            // 多语句Lambda方法写法
            Func<int, int> lambdaFunc5 = (i) => { var val = i * i; return val; };
        }

        public ActionFunc Test1()
        {
            int count = 0;
            return delegate(string s) { ++count; Console.WriteLine("Count:" + count.ToString()); }; ;
        }

        public static void Main(string[] args)
        {
            string testRef = "";
            string testOut = "";
            new Program().Test(ref testRef, out testOut);
            // 外部方法值修改(这个和JavaScript感觉很像)
            var aa = new Program().Test1();
            aa("");
            aa("");
        }

    }
}

转载请注明:宇托的狗窝 » C#中匿名方法和Lambda表达式的使用

发表我的评论
取消评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址