【转】[C#] 参数前加 in 的作用
转自:kimi.com
一句话:
in 就是**“按引用只读传参”**——把大型结构体按地址传进去,既省拷贝又保证你在方法里绝对不能改它。拆开说:
-
只读引用csharp
void Foo(in BigStruct s) { /* 不能给 s 重新赋值,也不能改字段 */ }编译器帮你加readonly保护,任何修改直接报错。 -
省拷贝
结构体很大时,不需要整份复制,只传一个 8 字节指针(x64),性能接近传ref,但无副作用。 -
调用端语法
调用时不需要写in:Foo(myStruct);或Foo(in myStruct);都行;写不写效果一样,写上是显式提示。 -
与
ref readonly的返回值配对csharpref readonly BigStruct Get() => ref _cache; Foo(Get()); // 全程零拷贝 -
不能用于
• 类(class)——本来就是引用,再包一层没意义
•async、iterator方法
• 作为接口/委托签名(除非显式in)
速记口诀
in = “传进来,别碰它,省拷贝”。
浙公网安备 33010602011771号