c# - 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,它也会通过引用传递它?因为类是引用,所以将字符串作为引用传递是否有意义?
解决方案
我认为你误解了这篇文章。
我理解它的方式是考虑以下方法:
void Foo(in SomeBigValueType t)
{ ... }
以下两个调用是相同的:
SomeBigValueType v;
Foo(v);
Foo(in v);
您的问题似乎与文章无关。in
需要一个存储位置(又名变量)。在你的第二个例子中,你没有通过一个,所以你得到一个错误;你会得到同样的错误ref
or out
。
推荐阅读
- r - 如何使用 R 中的 data.table 找到股票的月收益?
- node.js - 如何使用 node.js 将选项值更新到我的 mongodb 数据库
- wordpress - 由于存在小数,因此无法按评级对帖子进行排序
- r - observEvent shiny 模块中的动态过滤器数据
- css - 网格展开时的最小内容行
- php - 通过验证在线格式化程序的json编码格式解析错误
- flutter - 从 Flutter 中的异步 Future 函数获取数据
- swift - 按钮增加数字直到 50,然后开始减少直到 0 或更低,创建循环
- database - 数据库系统对计算机科学其他领域的主要贡献是什么?
- docker - docker-compose:写入、读取和监视主机目录的权限被拒绝