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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:02:19