自修改对象的Ref vs No Ref

本文关键字:Ref vs No 修改 对象 | 更新日期: 2023-09-27 18:12:34

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

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

自修改对象的Ref vs No Ref

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

c = new ClassThing();

在这种情况下,您将使用ref

这并不取决于你的情况。

但是:

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

根据MSDN指南传递引用类型参数:

当按值传递引用类型形参时,可以更改引用所指向的数据,例如类成员的值。但是,不能更改引用本身的值;也就是说,您不能使用相同的引用为新类分配内存,并使其在块外持久存在。要做到这一点,使用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()的具体行为