【问题标题】:Ref vs No Ref for self-modifying objects自修改对象的 Ref 与无 Ref
【发布时间】:2011-12-15 00:40:15
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    这不取决于你的情况。

    但是:

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

    【讨论】:

      【解决方案2】:

      根据the MSDN guide to passing reference-type parameters

      当你通过值传递引用类型的参数时,可以改变引用指向的数据,例如类成员的值。但是,您不能更改引用本身的值;也就是说,您不能使用相同的引用来为新类分配内存并让它在块之外持续存在。为此,请使用 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() 的行为。

      【讨论】:

        【解决方案3】:

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

        c = new ClassThing();
        

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

        【讨论】:

        • 我想我可以改写这个问题,问当你只在 c 上调用没有返回值但确实影响 c 本身的函数时, ref 是否会改变任何东西。
        • 它没有任何改变。 (对不起,这就是我说it doesn't matter时的意思)
        猜你喜欢
        • 1970-01-01
        • 2011-02-25
        • 2017-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-14
        • 2010-10-18
        • 1970-01-01
        相关资源
        最近更新 更多