5

我想知道以下方法在如何引用对象参数方面有什么区别:

public void DoSomething(object parameter){}

public void DoSomething(ref object parameter){}

我应该ref object parameter在我想将引用更改为object不覆盖同一引用中的对象的情况下使用吗?

4

5 回答 5

8
public void DoSomething(object parameter)
{
  parameter = new Object(); // original object from the callee would be unaffected. 
}

public void DoSomething(ref object parameter)
{
  parameter = new Object(); // original object would be a new object 
}

请参阅文章:Jon Skeet 的 C# 中的参数传递

在 C# 中,引用类型对象的地址是按值传递的,当使用ref关键字时,可以为原始对象分配一个新对象或 null,没有ref关键字是不可能的。

考虑以下示例:

class Program
{
    static void Main(string[] args)
    {
        Object obj1 = new object();
        obj1 = "Something";

        DoSomething(obj1);
        Console.WriteLine(obj1);

        DoSomethingCreateNew(ref obj1);
        Console.WriteLine(obj1);

        DoSomethingAssignNull(ref obj1);
        Console.WriteLine(obj1 == null);
        Console.ReadLine();
    }
    public static void DoSomething(object parameter)
    {
        parameter = new Object(); // original object from the callee would be unaffected. 
    }

    public static void DoSomethingCreateNew(ref object parameter)
    {
        parameter = new Object(); // original object would be a new object 
    }

    public static void DoSomethingAssignNull(ref object parameter)
    {
        parameter = null; // original object would be a null 
    }
}

输出将是:

Something
System.Object
True
于 2013-05-10T08:57:07.993 回答
1

通过 ref 传递变量允许函数将该变量重新指向另一个对象,或者实际上是 null:例如

object parameter = new object();

FailedChangeRef(parameter); // parameter still points to the same object
ChangeRef(ref parameter); // parameter now points to null

public void FailedChangeRef(object parameter)
{
            parameter = null; // this has no effect on the calling variable
}

public void ChangeRef(ref object parameter)
{
            parameter = null;  
}
于 2013-05-10T09:03:40.510 回答
0

在 C# 中,方法参数的默认机制是按值传递。因此,如果您要声明这样的方法,

public void DoSomething(object parameter){} // Pass by value

因此,创建了对象的新副本,因此对参数的更改不会影响传入的原始对象。

但是,当你通过引用传递参数时,它是通过引用传递

public void DoSomething(ref object parameter) // Pass by reference

现在,您正在对最初传递的对象的地址进行操作。因此,您对方法内的参数所做的更改将影响原始对象。

于 2013-05-10T09:06:08.783 回答
0

Argument Passing ByVal: 描述按值传递参数,这意味着过程不能修改变量本身。

Argument Passing ByRef: 描述通过引用传递参数,这意味着过程可以修改变量本身。

于 2013-05-10T08:57:41.213 回答
0

当您看到ref object这意味着,参数必须是object类型。

您可以在文档中阅读:

当形参是引用形参时,方法调用中的相应实参必须由关键字 ref 后跟与形参相同类型的变量引用(第 5.3.3 节)组成。必须明确分配变量,然后才能将其作为引用参数传递。

于 2013-05-10T08:58:41.663 回答