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

C#中对应C++方法签名里&param参数形式的等价写法是什么

C#完全支持和C按引用传递参数同类的功能,根据不同场景对应三种关键字实现,其中和C&效果最匹配的是ref关键字:

1. 普通可写引用传递(对应C++非const引用传递)

在方法签名的参数前加ref修饰,方法内部对参数的修改(包括修改参数本身的指向、修改参数的属性值)都会直接作用到调用方传入的原变量上,和C++&的行为完全一致。

对应你给出的C++示例,C#的写法如下:

// 方法定义:用ref标记参数为按引用传递
void Test(ref GameVector vecInfo)
{
    // 直接操作原变量,不需要额外取地址
    _gameVector = vecInfo;
    // 修改参数属性会同步到原变量
    vecInfo.X = 100;
    // ... 其他逻辑
}

调用时需要显式加ref关键字,避免调用方不知情修改参数:

// 调用示例
GameVector myVec = new GameVector();
Test(ref myVec);

2. 输出专用引用传递(out关键字)

如果场景是方法仅用来输出结果、不需要调用方提前初始化参数,可以用out关键字,要求方法内部必须给参数赋值,否则编译不通过:

void CreateVector(out GameVector vecInfo)
{
    // 必须给out参数赋值,否则编译报错
    vecInfo = new GameVector { X = 10, Y = 20 };
}

// 调用示例,不需要提前初始化myVec
CreateVector(out GameVector myVec);
Console.WriteLine(myVec.X); // 输出 10

3. 只读引用传递(in关键字,C# 7.2及以上版本支持)

如果仅想避免大值类型的拷贝开销、不允许方法修改参数,可以用in关键字,对应C++的const &:

void PrintVector(in GameVector vecInfo)
{
    // vecInfo.X = 100; // 编译报错,不允许修改in修饰的参数
    Console.WriteLine(vecInfo.X);
}

// 调用示例
GameVector myVec = new GameVector { X = 50 };
PrintVector(in myVec);

常见误区说明:C#中引用类型默认是按值传递引用的副本,如果你只是修改引用类型对象的内部属性,不需要加ref;但如果你需要把参数重新赋值为新对象、且让调用方的原变量也指向新对象,就必须加ref。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 22:48:03