所以,我(认为我)理解了 in
参数修饰符的作用。但它所做的似乎是相当多余的。
通常,我认为使用 ref
的唯一原因是修改调用变量,这被 明确禁止在
。因此,通过 in
引用传递在逻辑上似乎等同于通过值传递。
是否有某种性能优势?我相信在后端方面,ref
参数必须至少复制变量的物理地址,它应该与任何变量的大小相同典型的对象引用。
那么,优势是只存在于更大的结构中,还是存在一些幕后编译器优化使其在其他地方具有吸引力?如果是后者,为什么我不应该让每个参数成为一个in
?
最佳答案
in
最近引入了 C# 语言。
in
实际上是一个ref readonly
。一般来说,in
只有一种用例有帮助:处理大量大型 readonly struct
的高性能应用程序。
假设您有:
readonly struct VeryLarge
{
public readonly long Value1;
public readonly long Value2;
public long Compute() { }
// etc
}
和
void Process(in VeryLarge value) { }
在这种情况下,VeryLarge
结构将通过引用传递,而不会在 Process
方法中使用此结构时创建防御副本(例如调用 时) value.Compute()
),并且结构不变性由编译器保证。
请注意,传递带有 in
修饰符的非只读 struct
将导致编译器在调用 struct 的方法时创建防御副本,并且在上面的 Process
方法中访问属性,这将对性能产生负面影响!
有一个真的很好MSDN blog entry我建议仔细阅读。
如果您想了解更多关于 in
的历史背景介绍,您可以阅读此 discussion在 C# 语言的 GitHub 存储库中。
一般来说,大多数开发人员都认为引入 in
可能被视为错误。这是一种相当奇特的语言功能,只能在高性能边缘情况下使用。
关于c# - 为什么有人会在 C# 中使用 "in"参数修饰符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52820372/