C#使用引用参数

时间:2013-06-07 14:25:33

标签: c# reference parameter-passing

参考参数仅对valuetypes有用吗? 例如,如果你有一个传入类的方法,ref关键字是无用的?

public class someclass
{

}    

somefunction(ref someclass input)
{

}

3 个答案:

答案 0 :(得分:1)

你肯定可以为类类型使用ref参数。例如:

void MyClassFactory(ref MyClass newRef)
{
    newRef = new MyClass();
}

MyClass someRef = null;
MyClassFactory(ref someRef);
// Now someRef is referencing a new MyClass object.

请注意,如果没有ref关键字,上述代码将

答案 1 :(得分:0)

如果需要用新对象替换赋值函数,

ref对引用类型很有用。例如:

class MyClass
{

}

class MyClass2 : MyClass
{
   public MyClass2(MyClass original)
   {
   }
}

bool UpdateMyClass(ref MyClass input)
{
   bool success = false;

   if (input != null)
   {
       //Generate a new object with some additional functionality.
       input = new MyClassWithSuperPowers(input);
       success = true;
   }

   return success;
}

当然,最明显的用例是字符串类。

void FormatString(ref string data)
{
  data = DateTime.Now + data;
}

答案 2 :(得分:0)

我的理解是这个(如果我错了,我希望有人纠正我):

C#包含值类型(在堆栈上分配)和引用类型(在堆上分配)。

但是,默认情况下,所有参数都按值传递,这意味着如果调用函数

myFunc(myClass param) { }
...
myClass myVar = new myClass();
myFunc(myVar);
//myVar will not be changed here

然后将创建一个廉价的myVar副本并传递给myFunc。

如果使用'ref'关键字传递相同的参数,则不会生成myVar的副本,而是传入对myVar的引用。然后myFunc中对myVar所做的任何更改都会反映在myVar中myFunc返回。

myFunc(ref myClass param) { }
...
myClass myVar = new myClass();
myFunc(ref myVar);
//myVar might be changed here

我很难找到一篇实际上讨论参数的文章,而不仅仅是价值与参考类型,但我认为这是它的工作原理。