C# 7.2 使用“in parameter”作为运算符

Sea*_* M. 5 c# operators c#-7.2 in-parameters

在 C# 7.2 中,我们看到了in方法参数修饰符的引入,以将只读引用传递给对象。我正在使用 7.2 开发一个新的 .NET Standard 项目,出于好奇,我尝试in在结构的相等运算符的参数上使用关键字进行编译。

IE - public static bool operator == (in Point l, in Point r)

不是 - public static bool operator == (Point l, Point r)

我最初对这行得通感到有点惊讶,但经过仔细思考后,我意识到这两个版本的运算符之间可能没有功能差异。我想确认这些怀疑,但经过一番彻底的搜索后,我找不到任何明确谈论in在运算符重载中使用关键字的内容。

所以我的问题是这是否真的有功能差异,如果有,是否有任何特别的理由鼓励或阻止使用inwith 运算符参数。我最初的想法是没有区别,特别是如果操作符是内联的。但是,如果确实有所作为,似乎 in 参数应该在任何地方使用(只读引用有意义的任何地方,即),因为它们提供了速度奖励,并且与refand不同out,不需要用户预先添加传递对象时的那些关键字。这将允许更有效的值类型对象传递,而无需对方法和运算符的用户进行任何更改。

总的来说,这可能超出了大多数 C# 开发人员担心的那种小规模优化,但我很好奇它是否有效果。

Alb*_*rtK 0

这是否实际上有功能差异......我最初的想法是没有差异,特别是如果运算符是内联的

由于运算符==重载的调用方式与 中的常规静态方法类似MSIL,因此它具有功能差异。它可以帮助避免像常规方法一样不必要的复制。

是否有任何特殊原因鼓励或阻止将 in 与运算符参数一起使用。

根据本文,建议in当值类型大于 时应用修饰符System.IntPtr.Size。但重要的是值类型应该是 readonly struct。否则in修饰符可能会损害性能,因为编译器在调用结构体的方法和属性时会创建一个防御性副本,因为它们可以更改参数的状态。