Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当两者工作相同时,是否应使用值或引用?_C#_Ref - Fatal编程技术网

C# 当两者工作相同时,是否应使用值或引用?

C# 当两者工作相同时,是否应使用值或引用?,c#,ref,C#,Ref,如果您有一个方法,一个接受变量的方法,并且实际上根本不修改物理变量,您是否应该使用ref引用输入参数?这其实并不重要,因为变量无论如何都不会被修改,那么使用ref的缺点/优点是什么呢?(至少在C#中) 比如说, int[] numbers = new int[] { /* some numbers */ }; int getNumberValue(int index) { return numbers[index]; } int getNumberRef(ref int index) {

如果您有一个方法,一个接受变量的方法,并且实际上根本不修改物理变量,您是否应该使用
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/out。这基本上是一种获取另一个返回值的方法,通常应该避免,因为这意味着该方法可能试图做得太多了。情况并非总是如此(TryParse等是合理使用out的典型示例),但使用ref/out应该是相对罕见的


更多信息。

你不能那样使用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版本会更快
你想要切面包。你可以从抽屉里拿出一把刀,或者去买一把武士刀来切面包。如果你显然不需要,为什么要用武士刀?需要时使用武士刀。(糟糕的类比事实上,卡塔纳非常酷,如果我有,我会用它来切面包)@dcastro你是对的,糟糕的类比。@L.B我不擅长类比:(但我希望我的观点是正确的,因为我确实知道
ref
的作用,我只是想知道是否有正当理由在不需要的时候使用它。我认为这样会更快,因为
ref
不必克隆变量,但不……。另外@user1319644只有在值类型为值时才克隆值。)(例如,
int
double
bool
)。这些值非常小,实际上并不重要。此外,在某些情况下,性能可能更差-克隆布尔值(1字节)比克隆指向布尔值(4/8字节)的指针更快另外,。不要关心这些小细节-专注于编写正确、灵活和可维护的软件。如果您的应用程序不符合性能要求,那么使用探查器查找瓶颈-99%的时间,瓶颈与磁盘访问、数据库或网络连接有关。这些是您应该做的事情我会担心的。