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;

我不明白这些参数是通过引用传递的(如refout)。

我不明白的是in 参数的用途。使用它们我能得到什么? 我了解outref 参数的用途,能够为调用范围内的变量赋值非常有用,但是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# 中的 in 参数和性能分析

C#中'in'关键字的用途是啥? [复制]

C# 7.2 const vs referenced(in) 函数参数传递中的只读字段

在 C# 中将查询参数作为参数传递给 BigQuery 中的 IN 运算符的正确方法

SQL Server参数化SQL语句中的like和in查询的语法(C#)

SQL Server参数化SQL语句中的like和in查询的语法(C#)