c# - lambda 表达式中的对象范围

标签 c# delegates lambda

我是 C# 的新手,正在尝试理解 lambda 表达式和委托(delegate)。这是我正在运行的代码:

delegate bool D1();
delegate bool D2(int i);

namespace Console
{
    class Program
    {
        D1 d1;
        D2 d2;

        public void testMethod(int input)
        {
            int j = 0;
            d1 = () => { j = 10; return j < input; };
            d2 = (x) => { return x == j; };
            System.Console.WriteLine("j = {0}", j);

            bool res = d1();
            System.Console.WriteLine("res={0}, j ={1}", res, j);

        }

        static void Main(string[] args)
        {
            Program p = new Program();
            p.testMethod(10);
            System.Console.WriteLine(p.d2(10));
            System.Console.ReadKey();
        }
    }
}

我不明白的是 d2 的调用打印 true。当构造d2时,j的值是0。它仅在稍后在 testMethod 中调用 d1 后才更改。那么它是如何打印 True 的呢?我在这里错过了什么?

最佳答案

d1d2 都引用 j 的同一个实例。当您通过调用 d1 设置 j 时,您也改变了 d2 可以看到的变量的值。

如果你希望它们有不同的 j 实例,你需要限定变量的范围:

{
  int j = 0;
  d1 = () => { j = 10; return j < input; };
}

{
  int j = 0;
  d2 = (x) => { return x == j; };
}

但是,如果您要这样做,那么您最好有两个不同的变量,例如 j1j2。这将更具可读性。

关于c# - lambda 表达式中的对象范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8534118/

相关文章:

c# - 创建具有任意参数的委托(delegate)

iphone - 将 UINavigaitionController 连接到 Interface builder 中的委托(delegate)

java - 使用 Java8 Streams 时是否可以获取 ArrayList<Object> 的索引?

java - 将函数作为参数传递给 Lambda java 8

ios - 如何从第二个 View Controller 获取表格 View 单元格文本标签到第一个 View Controller 的标签?

c# - Globalprotect VPN 批处理文件或 C# 代码

c# - mscorlib.dll 中发生“System.Net.Http.HttpRequestException”,但未在用户代码中处理

c# - Nhibernate 尝试在保存时添加重复列

c# - lambda 内连接并选择全部

c# - 遍历大量记录