0

参考参数只对值类型有用吗?例如,如果您有一个传入类的方法,那么 ref 关键字就没用了吗?

public class someclass
{

}    

somefunction(ref someclass input)
{

}
4

3 回答 3

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

于 2013-06-07T14:30:52.157 回答
0

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

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

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

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

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

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

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

我很难找到一篇真正讨论参数而不仅仅是值与引用类型的文章,但我认为这就是它的工作原理。

于 2013-06-07T15:15:50.733 回答
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;
}
于 2013-06-07T14:40:19.663 回答