当两者的工作方式相同时,应使用值或引用

本文关键字:引用 工作 方式相 | 更新日期: 2023-09-27 18:32:27

如果你有一个方法,一个接受变量的方法,并且实际上根本不修改物理变量,你应该使用ref来引用输入参数吗?这应该无关紧要,因为变量无论如何都不会被修改,那么使用 ref 的缺点/优点是什么?(至少在 C# 中)

例如

int[] numbers = new int[] { /* some numbers */ };
int getNumberValue(int index)
{
    return numbers[index];
}
int getNumberRef(ref int index)
{
    return numbers[index];
}

为什么您更喜欢这两种方法中的任何一种?它们的工作方式相同,因为参数永远不会被修改......

我认为如果我使用 180 亿次,ref版本会更快,因为值版本可能会克隆参数,以便方法可以修改它(但我可能是错的),尽管可能存在一些缺点。

当两者的工作方式相同时,应使用值或引用

您不会以这种方式使用 ref。 ref 确实改变了传递的变量的引用。因此,您可以在需要时使用它。就这么简单。

除非你不需要函数或方法来更改引用,否则你根本不应该使用它,通常最好避免引用。

Ref 的工作原理是这样的:

 int a = 5;
 int b = 6;

 _swap(ref a, ref b);

 // a is now 6 and b is now 5;

这是交换方法:

 void _swap(ref int a, ref int b)
 { 
     int tmp = a;
     a = b;
     b = tmp;
 }

在这里测试

它们在功能上是等效的,但它们在语义上非常不同。

具有签名(如 Method(ref string s))的方法告诉客户端可能需要为s分配一个新值。因此,客户端将根据这个错误的假设采取行动,并执行他不需要的操作,例如在调用方法后检查s是否为 null,或进行某种其他类型的验证。

另外,作为一般的编程建议,不要使用不需要的东西!你增加了不必要的复杂性,你会混淆自己和他人。这种行为导致了货物崇拜节目。

有用的答案:你几乎不需要使用 ref/out。它基本上是获取另一个返回值的一种方式,通常应该避免,因为这意味着该方法可能试图做太多事情。情况并非总是如此(TryParse等是合理使用out的规范示例),但使用ref/out应该是相对罕见的。

更多信息在这里。