如何在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
相关产品推荐
相关产品推荐

