You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#的Lambda表达式中访问类成员?附Java实现对比

在C#的Lambda表达式中访问类成员的正确方式

你在Java里的实现思路完全可以平移到C#里,只需要把Java的Runnable换成C#对应的Action委托就行,而且Lambda访问类成员的方式和Java几乎一致。

先看你给出的Java代码(运行正常输出s is 3):

public class HelloWorld { 
    public static void main(String[] args) { 
        OtherClass oc = new OtherClass(); 
        oc.a.run(); 
    } 
}
public class OtherClass { 
    public int s = 3; 
    public Runnable a = () -> System.out.println("s is " + s); 
}

对应的完整C#代码应该是这样的:

using System;

namespace SomeNamespace
{
    public class Program
    {
        public static void Main(string[] args)
        {
            MyClass m = new MyClass();
            m.a(); // 这里可以直接调用,不用写Invoke(),当然写Invoke()也没问题
            // m.a.Invoke(); 这行和上面效果一样
        }
    }

    public class MyClass
    {
        public int s = 3;
        // Java的Runnable对应C#的Action(无参数、无返回值的委托)
        public Action a = () => Console.WriteLine($"s is {s}");
    }
}

这段代码运行后会输出s is 3,和你的Java代码效果完全一致。

关键说明

  • C#的Lambda表达式会自动捕获当前类实例的成员变量,只要该成员的访问权限允许(比如这里是public,所以外部实例可以访问,Lambda也能正常捕获)。
  • 如果你的类成员是private或protected,只要Lambda是在类内部定义的,同样可以访问,就像类的普通方法一样。
  • 和Java类似,Lambda捕获的是实例的引用,而不是变量的副本。如果后续修改了s的值,再调用a会输出更新后的结果:
    MyClass m = new MyClass();
    m.s = 5;
    m.a(); // 会输出 "s is 5"
    

内容的提问来源于stack exchange,提问作者sasha199568

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:31:48