当两者的工作方式相同时,应使用值或引用
本文关键字:引用 工作 方式相 | 更新日期: 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应该是相对罕见的。
更多信息在这里。