【转】[C#] 参数前加 in 的作用

转自:kimi.com

一句话:
in 就是**“按引用只读传参”**——把大型结构体按地址传进去,既省拷贝又保证你在方法里绝对不能改它。

拆开说:
  1. 只读引用
    csharp
    Copy
    void Foo(in BigStruct s) { /* 不能给 s 重新赋值,也不能改字段 */ }
     
    编译器帮你加 readonly 保护,任何修改直接报错。
  2. 省拷贝
    结构体很大时,不需要整份复制,只传一个 8 字节指针(x64),性能接近传 ref,但无副作用。
  3. 调用端语法
    调用时不需要写 inFoo(myStruct);Foo(in myStruct); 都行;写不写效果一样,写上是显式提示。
  4. ref readonly 的返回值配对
    csharp
    Copy
    ref readonly BigStruct Get() => ref _cache;
    Foo(Get());        // 全程零拷贝
     
  5. 不能用于
    • 类(class)——本来就是引用,再包一层没意义
    asynciterator 方法
    • 作为接口/委托签名(除非显式 in

速记口诀
in = “传进来,别碰它,省拷贝”。
posted on 2025-07-28 00:55  z5337  阅读(23)  评论(0)    收藏  举报