如果我将一个对象传递给一个方法,为什么我应该使用ref关键字?这难道不是默认的行为吗?

例如:

class Program
{
    static void Main(string[] args)
    {
        TestRef t = new TestRef();
        t.Something = "Foo";

        DoSomething(t);
        Console.WriteLine(t.Something);
    }

    static public void DoSomething(TestRef t)
    {
        t.Something = "Bar";
    }
}


public class TestRef
{
    public string Something { get; set; }
}

输出是“Bar”,这意味着对象作为引用传递。


当前回答

由于TestRef是一个类(它是引用对象),您可以在不将t作为引用传递的情况下更改t内部的内容。然而,如果您将t作为引用传递,TestRef可以更改原始t所引用的内容。也就是说,让它指向一个不同的对象。

其他回答

但是,如果您传递的是一个值,情况就不同了。您可以强制通过引用传递值。例如,这允许您将一个整数传递给一个方法,并让该方法代表您修改该整数。

有了ref,你可以写:

static public void DoSomething(ref TestRef t)
{
    t = new TestRef();
}

t将在方法完成后更改。

由于TestRef是一个类(它是引用对象),您可以在不将t作为引用传递的情况下更改t内部的内容。然而,如果您将t作为引用传递,TestRef可以更改原始t所引用的内容。也就是说,让它指向一个不同的对象。

你需要区分“通过值传递引用”和“通过引用传递参数/参数”。

我写了一篇相当长的关于这个主题的文章,以避免每次在新闻组上出现这个问题时都要仔细写

通过对引用类型使用ref关键字,可以有效地将引用传递给引用。在许多方面,这与使用out关键字是相同的,但有一个微小的区别,即不能保证该方法实际会将任何东西赋值给ref'ed形参。