【发布时间】:2019-06-01 09:48:30
【问题描述】:
我对 in 参数修饰符有点困惑: 我知道如果我在参数之前写入它是一个只读引用,这比通过值传递大的东西更快。根据https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/in-parameter-modifier 的文档,它说 in 参数修饰符在调用站点上是可选的:
在调用站点为参数指定 in 通常是可选的。按值传递参数和使用 in 修饰符通过引用传递参数之间没有语义差异。调用站点的 in 修饰符是可选的,因为您不需要指示参数的值可能会更改。您在调用站点显式添加 in 修饰符以确保参数通过引用而不是值传递。显式使用 in 有以下两种效果:
首先,在调用点指定 in 会强制编译器选择使用匹配 in 参数定义的方法。否则,当两个方法仅在存在 in 时有所不同时,按值重载是更好的匹配。
其次,指定 in 表明您打算通过引用传递参数
当我在我的代码中使用它时:
public static kAssetKind? DetermineAssetKind(in string extension)...
我在这里称它为:
...{FilePath = mainFile, Kind = DetermineAssetKind(Path.GetExtension(mainFile)) ?? kAssetKind.Other};
没关系,字符串是通过引用传递的,但如果我之前专门写过:
DetermineAssetKind(in Path.GetExtension(mainFile))
in 得到一个可以通过引用传递的错误。因此,调用站点上的 in 和它说“第二,指定 in 声明您打算通过引用传递参数”之间存在差异,但我认为即使我不在调用站点使用 in,它也会通过引用传递它?因为类是引用,所以将字符串作为引用传递是否有意义?
【问题讨论】:
-
将
string传递为in有点荒谬,不是吗? -
你在说什么错误?运行时错误、编译器错误,还是只是警告?