为什么我需要在声明和调用中使用ref关键字?

MRG*_*MRG 6 c# ref keyword

重复:调用者的"out"关键字的目的是什么?

为什么我需要在声明和调用中使用'ref'关键字.

void foo(ref int i)
{

}
Run Code Online (Sandbox Code Playgroud)

例如,考虑以上功能.如果我在没有ref关键字的情况下调用它

foo(k);
Run Code Online (Sandbox Code Playgroud)

它会给我错误:

必须使用'ref'关键字传递参数'1'

为什么仅仅在方法签名中指定它是不够的?

Gra*_*ton 12

这是因为ref表明参数应该通过引用传入.它类似于C++中的指针

例如;

void CalFoo()
{
  var i=10;
  foo(ref i);  //i=11
}
void foo(ref int i)
{
   i++;
}
Run Code Online (Sandbox Code Playgroud)

void CalFoo()
{
  var i=10;
  foo(i);  //i=10
}
void foo(int i)
{
   i++;
}
Run Code Online (Sandbox Code Playgroud)

我认为你可以同时foo(ref int)foo(int)一个单独的类.所以如果你没有指定ref..编译器如何知道调用哪一个?

  • 我根本不会提出这个问题的重载问题... .NET的编译器会在幕后解决一些非常复杂的重载(特别是现在引入了`dynamic`类型)并且对于模糊的情况有错误.使用`ref`关键字更重要的是明确显示值可能在方法调用中发生变化. (3认同)

Len*_*ert 9

它增强了可读性/可理解性:当您查看方法调用时,您知道ref值可能会更改.