C#中对应C++方法签名里¶m参数形式的等价写法是什么
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
相关产品推荐
相关产品推荐

