c#的inout
时间: 2025-04-21 18:40:34 浏览: 32
### C# 中 `in` 和 `out` 参数的使用
在 C# 中,`in` 和 `out` 是两种不同的参数修饰符,它们允许以特定方式传递参数。
#### `out` 参数
`out` 关键字表示该参数是由方法写入并返回给调用者。这意味着,在方法体内必须对该参数赋值,并且可以在方法外部访问其新值[^1]。
```csharp
public void MethodWithOutParameter(out int value) {
value = 42;
}
```
当定义带有 `out` 参数的方法时,不需要初始化这些参数;相反,应该确保在离开方法之前对其进行了适当设置。对于上述例子中的 `MethodWithOutParameter` 函数来说,它接受一个整数类型的 `out` 参数并在函数内为其分配了一个具体的数值。
#### `in` 参数
另一方面,`in` 关键字意味着传入的对象不会被改变,即它是只读的。这使得编译器能够优化性能,因为知道对象的内容不会发生变化[^5]。
```csharp
public void MethodWithInParameter(in Point point) {
Console.WriteLine($"Point coordinates are ({point.X}, {point.Y})");
}
// 定义不可变结构体
readonly struct Point {
public readonly int X, Y;
public Point(int x, int y) => (X, Y) = (x, y);
}
```
在这个例子中,`MethodWithInParameter` 接收一个名为 `point` 的 `in` 类型参数,这是一个自定义的不可变结构体实例。由于指定了 `in`,所以即使尝试修改这个变量也不会影响原始数据。
#### 结合使用的场景
有时可能会遇到既需要输入也需要输出的情形,这时就可以考虑同时运用这两种特性来满足需求:
```csharp
class Program {
static void Main() {
var input = new Point(0, 0);
ModifyAndReturn(ref input); // 修改input的同时也接收新的值
PrintModifiedValue(input);
// 输出结果将是已更改的位置坐标以及计算得出的新位置
}
private static void ModifyAndReturn(in Point originalPosition, out Point newPosition) {
newPosition = new Point(originalPosition.X + 1, originalPosition.Y + 1);
Console.WriteLine(
$"Original position was ({originalPosition.X},{originalPosition.Y}), " +
$"new position is ({newPosition.X},{newPosition.Y})."
);
}
private static void PrintModifiedValue(Point p){
Console.WriteLine($"The modified point has these coordinates:({p.X},{p.Y})");
}
}
```
这里展示了如何在一个方法签名里同时利用 `in` 和 `out` 来处理既有不变量又有变化的数据流情况。注意这里的 `ModifyAndReturn` 方法不仅接受了来自外界的一个固定点位信息(`in`),还向外面提供了经过变换之后的结果(`out`)。
阅读全文
相关推荐



















