c# - 为什么有人会在 C# 中使用 "in"参数修饰符?

标签 c# c#-7.2

所以,我(认为我)理解了 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/

相关文章:

c# - 将 is 运算符与无约束泛型一起使用

C# MySQL Select into Var -> 内存增加

c# - 我可以在重载的结构运算符中使用常量参数吗?

c# - Entity Framework 将数字(1)转换为 bool 帮助?

c# - 像 Windows 窗体一样使用 .designer.cs 生成代码

c# - Devenv Commandline Build 不使用 C# 7.2 语言功能

c# - 如果我有一个以非只读结构作为成员的 c# 只读结构,编译器是否会创建带有 in 参数的防御性副本

c# - 在旧 C# 版本中使用 ref struct 参数覆盖方法

c# - 将用户添加到 signalr 组时如何显示所有以前的消息?

c# - 在节目中展开 C# propertygrid