C# 中“in”参数的用途
Posted
技术标签:
【中文标题】C# 中“in”参数的用途【英文标题】:Purpose of "in" parameters in C# 【发布时间】:2019-01-15 12:28:29 【问题描述】:C# 7.2 为方法引入了in
参数。我了解它们的工作原理:
int MyMethod(in int i)
i += 1; // illegal, i is read-only
return i + 1;
我不明白这些参数是通过引用传递的(如ref
和out
)。
我不明白的是in
参数的用途。使用它们我能得到什么?
我了解out
和ref
参数的用途,能够为调用范围内的变量赋值非常有用,但是in
参数不存在该函数。
【问题讨论】:
C# 7.2 - In Parameter And Performance 参见docs.microsoft.com/en-US/dotnet/csharp/programming-guide/…:“要通过引用传递以避免复制但不更改值,请使用 in 修饰符。” 也相关:blogs.msdn.microsoft.com/mazhou/2018/01/08/…。它作为readonly ref
参数工作(不能在方法体内重新分配)。
@MackThax:使用 int (或任何原始值类型)是一个有点糟糕的例子。但是,如果您有更复杂的值类型/结构,则通过引用传递可以避免复制它。然后in
额外提供了一个安全防护,以防止意外更改原始结构。对于int
,唯一的好处是避免意外更改它,但就像您建议的那样,您不会从原始类型中获得太多收益。
是的,in
只为(大)结构提供实际好处,因为在我想 99% 的情况下,您想要通过引用传递原始值类型是您想要更改传递变量本身,这对于 in
是不可能的。
【参考方案1】:
"in" 可用于将变量作为只读引用(值类型和引用类型两者)传递。 传递只读引用的原因是,如果我传递一个没有引用的值类型变量,那么每次都会创建一个新副本。因此,它将需要额外的内存并且性能会变慢。
【讨论】:
以上是关于C# 中“in”参数的用途的主要内容,如果未能解决你的问题,请参考以下文章
C# 7.2 const vs referenced(in) 函数参数传递中的只读字段
在 C# 中将查询参数作为参数传递给 BigQuery 中的 IN 运算符的正确方法