首页 > 解决方案 > in 参数修饰符在调用站点上真的是可选的吗?

问题描述

我对 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,它也会通过引用传递它?因为类是引用,所以将字符串作为引用传递是否有意义?

标签: c#reference

解决方案


我认为你误解了这篇文章。

我理解它的方式是考虑以下方法:

void Foo(in SomeBigValueType t)
{ ... }

以下两个调用是相同的:

SomeBigValueType v;
Foo(v);
Foo(in v);

您的问题似乎与文章无关。in需要一个存储位置(又名变量)。在你的第二个例子中,你没有通过一个,所以你得到一个错误;你会得到同样的错误refor out


推荐阅读