如何将C++ Lambda函数代码转换为C#?
C++ Lambda 转 C# 等价实现
嘿,你看到的C++代码里的[]是lambda表达式的捕获列表,这里是空捕获(表示不捕获任何外部变量),对应的C#写法其实非常直观,我来一步步给你拆解:
原C++代码的语义
先明确这段C++代码做了什么:
定义了一个lambda函数
Func,接受两个参数:
- 可修改的
int引用x(对应C++的int&)- 只读的
int引用y(对应C++的const int&)
函数逻辑是把y的值加到x上,调用时直接传变量a和b。
C# 等价实现
在C#里,我们不需要像C那样写捕获列表[](编译器会自动处理变量捕获逻辑),只需要用ref和in关键字对应C的引用语义:
写法1:让编译器自动推断委托类型(推荐)
// 定义lambda,ref对应可修改的引用,in对应只读引用 var Func = (ref int x, in int y) => { x += y; };
写法2:显式定义委托类型
如果你需要复用这个委托类型,可以先定义:
// 定义匹配的委托类型 delegate void IntModifyAction(ref int target, in int value); // 实例化委托 IntModifyAction Func = (ref int x, in int y) => x += y;
调用方式
调用时必须带上ref和in关键字,和定义保持一致:
int a = 5; int b = 3; Func(ref a, in b); // 执行后a的值为8,b的值保持3不变
关键细节说明
ref int x:对应C++的int& x,允许在lambda内部修改传入的变量值,修改会反映到外部变量。in int y:对应C++的const int& y,保证lambda内部无法修改y,同时避免值拷贝(对于大类型更高效,int类型差别不大,但能保持语义一致)。- C#的lambda默认不需要捕获列表,如果需要捕获外部变量(比如使用lambda外的变量),编译器会自动生成闭包,不需要手动声明。
内容的提问来源于stack exchange,提问作者Yan Chen
相关产品推荐
相关产品推荐

