应该使用值还是引用,当两者都相同时?

时间:2014-11-28 19:13:28

标签: c# ref

如果你有一个方法,一个接受变量但实际上根本没有修改物理变量的方法,你应该使用 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版本会更快,因为值版本可能会复制参数,因此方法可以修改它(但我可能错了),虽然可能存在一些缺点。

3 个答案:

答案 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的行为。