“in”运算符和简单值传递在C#中的区别

8
根据c# 7.2版本的说明,使用"in"运算符可以通过引用将变量传递到方法中,但无法在该方法内部进行设置。以下是一段示例代码:
 public static int Add(in int number1, in int number2)
 {
   return number1 + number2;
 }

并使用以下方式进行调用

 Add(ref myNo,4);

现在我的问题是,使用“in”运算符和不使用“in”运算符之间有什么大的区别?
public static int Add(int number1, in int number2)
 {
   return number1 + number2;
 }

并调用类似的:
Add(3,4);

这段代码也实现了相同的功能:

如果我们不想设置它,就不能设置它。

因此,“in”和没有“in”的唯一区别是我们不能在方法内部设置吗? 如果不是,请给我另一个例子。


1
基本上在第二个中你可以做 number1 = 3;,但是在第一个中会导致编译错误。这基本上是一种确保你不会给传入的变量赋值的方法。 - juharr
1
它以有些笨重的方式允许你在方法中使用不可变/只读参数,并且在调用时不需要使用 ref 部分。当使用 in 参数时,以下操作可以实现:Add(myNo, 4); 另一个重要的区别是,在异步方法或由闭包调用的方法中,无法使用 in 参数。我建议阅读这篇文章:https://blogs.msdn.microsoft.com/mazhou/2018/01/08/c-7-series-part-8-in-parameters/ - Stuart
1
最简单的解释是使用 in 关键字的变量变为 readonly,因此在函数范围内无法修改,而其他变量可以被修改。参考1参考2 - vikscool
非常感谢。 - TAHA SULTAN TEMURI
1个回答

7
以下内容清晰地解释了目的:
通过引用将变量传递给方法。无法在方法内设置。 来自官方文档: 参数上的in修饰符,用于指定参数是按引用传递的,但不会被调用方法修改。
唯一的区别是当使用in运算符的参数时,无法在方法内设置传入参数的值,而在普通参数中我们可以设置任何值,使用in限制了这种行为。
例如:
 public static int Add(in int number1, in int number2)
 {
   number1 = 2; // this will give compile time error as we cannot set it.
   return number1 + number2;
 }

在正常情况下,我们可以随时设置,尽管在示例中设置并没有意义,但清楚地解释了区别:

 public static int Add(int number1,int number2)
 {
   number1 = 2; // this works.
   return number1 + number2;
 }

因此,我们可以说方法参数在技术上变得不可变。
你可以在这里阅读更多详细信息。

非常感谢,因此我得出结论,它只限制用户在程序运行之前进行设置。 - TAHA SULTAN TEMURI
2
@TAHASULTANTEMURI 不是的,它是为了优化传递大的只读结构体而存在的。对于 int 使用它是没有意义的。你不能重新分配变量的事实只是一个副作用,而不是 in 修饰符的目的。 - Lucas Trzesniewski
请阅读上面提到的博客文章,该文章讨论了如何通过正常调用来改善值类型的性能,其中它们在方法调用时被按值复制。 - Ehsan Sajjad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接