除明确表达意图外,向方法传普通结构体时in参数比ref参数有性能优势吗?
普通结构体传递:
in vs ref 参数的性能与差异 性能优势分析
传递普通(非readonly)结构体时,in参数几乎不存在性能优势,反而大概率会更慢。
in参数的本质是「readonly ref」,但为了保证参数值不被修改,编译器会对非readonly结构体的in参数做防御性复制——每次调用方法或访问参数的成员时,都会创建一份结构体副本。虽然传递in参数时只是传引用,成本很低,但防御性复制的开销会完全抵消甚至超过这个优势,最终导致性能下降。
只有当结构体本身标记为readonly时,编译器才会移除防御性复制,此时in参数的性能表现才会和ref参数接近。
in参数的其他优势
除了你提到的两点,in还有这些实用价值:
- 强制只读语义:编译器会严格限制对
in参数的修改操作,从语法层面避免了方法内部意外修改传入的结构体实例,比ref更能保证数据的不可变性。 - 支持字面量/临时值传递:
ref参数要求传入的是可寻址的变量(比如字段、局部变量),而in允许直接传递字面量或表达式生成的临时结构体,调用更灵活:// 合法:in支持临时值 somemethod(in new MyStruct { Value = 1 }); // 非法:ref要求可寻址变量 somemethod(ref new MyStruct { Value = 1 }); - 调用语法更简洁:
in参数是可选修饰符,调用方可以省略in关键字直接传值,而ref必须显式标记。
关于ref的"安全性"
你觉得ref更安全,可能是担心in的防御性复制带来的意外开销,但从数据修改的角度看:
ref参数允许方法内部修改传入的结构体,若代码逻辑疏忽,可能会意外改变外部变量的值,引发难以排查的bug;in通过只读约束,从语法上杜绝了这种修改风险,反而在数据安全性上更有保障——只要正确使用readonly结构体配合in,就能兼顾性能和安全性。
代码示例对比
使用in参数
void somemethod(in MyStruct data); // 调用时可省略in somemethod(new MyStruct()); // 也可以显式标记 somemethod(in myStructInstance);
使用ref参数
void somemethod(ref MyStruct data); // 必须显式传ref,且只能传可寻址变量 somemethod(ref myStructInstance);
内容的提问来源于stack exchange,提问作者SteveH
相关产品推荐
相关产品推荐

