Ref vs No Ref用于自修改对象

时间:2011-10-25 14:53:54

标签: c# parameters pass-by-reference pass-by-value ref

如果在函数中修改了作为参数引用的对象,那么使用ref是否重要?以下两个函数之间有区别吗?

void DisposeObject(ClassThing c)
{
   c.Dispose();
}

void DisposeObject(ref ClassThing c)
{
   c.Dispose();
}

3 个答案:

答案 0 :(得分:6)

没关系。重要的是,如果您要为c分配内容(并希望它反映在方法之外):

c = new ClassThing();

在这种情况下,您使用ref

答案 1 :(得分:1)

它不依赖于你的情况。

<强> BUT:

如果你传递一个带有ref关键字的引用对象,你可以在方法内部更改引用,指向另一个此类型的对象(因此它将在方法之外可见)

答案 2 :(得分:0)

根据the MSDN guide to passing reference-type parameters

  

按值传递reference-type参数时,可以更改引用指向的数据,例如类成员的值。但是,您无法更改引用本身的值;也就是说,您不能使用相同的引用为新类分配内存并使其在块外保留。为此,请使用ref或out关键字传递参数。

因此您可以更改原始对象,但不能更改原始对象以引用内存中的其他位置。例如:

static void Main()
{
    int[] integerArray = new int[8];
    foo(integerArray);
}

private void foo(int[] myArray)
{
    myArray[0] = 5;  //this changes integerArray
    myArray = new int[4]; //this does not change integerArray,
                          // ... but it would if you used ref or out
}

所以差异很重要,虽然我不清楚Dispose()的行为。