如果我将一个对象传递给一个方法,为什么我应该使用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所引用的内容。也就是说,让它指向一个不同的对象。

其他回答

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

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

这就像在c中传递一个指针给另一个指针一样,在。net中,这将允许你改变原来的T指的是什么,尽管我个人认为,如果你在。net中这样做,你可能有一个设计问题!

在. net中,当您将任何参数传递给方法时,将创建一个副本。在值类型中意味着您对值所做的任何修改都在方法范围内,并且在退出方法时丢失。

当传递一个引用类型时,也会生成一个副本,但它是一个引用的副本,也就是说,现在内存中有两个对同一个对象的引用。因此,如果你使用引用来修改对象,它就会被修改。但是如果您修改了引用本身——我们必须记住它是一个副本——那么任何更改也会在退出方法时丢失。

正如人们之前所说,赋值是对引用的修改,因此丢失了:

public void Method1(object obj) {   
 obj = new Object(); 
}

public void Method2(object obj) {  
 obj = _privateObject; 
}

上述方法不修改原始对象。

对你的例子做一点修改

 using System;

    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 = new TestRef();
                t.Something = "Bar";
            }
        }



    public class TestRef
    {
    private string s;
        public string Something 
        { 
            get {return s;} 
            set { s = value; }
        }
    }

有了ref,你可以写:

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

t将在方法完成后更改。