如果你有一个方法,一个接受变量但实际上根本没有修改物理变量的方法,你应该使用 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
版本会更快,因为值版本可能会复制参数,因此方法可以修改它(但我可能错了),虽然可能存在一些缺点。
答案 0 :(得分:1)
你不要那样使用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;
}
测试here
答案 1 :(得分:0)
有用的答案:你几乎不需要使用ref / out。它基本上是一种获得另一个返回值的方法,通常应该被准确地避免,因为这意味着该方法可能试图做太多。情况并非总是如此(TryParse等是合理使用out的规范示例)但使用ref / out应该是相对罕见的。
更多信息here。
答案 2 :(得分:0)
他们在功能上相同,但他们在语义上非常不同。
带有Method(ref string s)
等签名的方法告诉客户可能需要为s
分配一个新值。因此,客户端将根据这个错误的假设采取行动,并执行他不需要做的事情,例如在调用方法后检查s
是否为空,或者进行其他类型的验证。
此外,作为一般编程建议,请勿使用您不需要的东西!你增加了不必要的复杂性,你会让自己和别人感到困惑。这是导致cargo cult programming的行为。