为什么在传递对象时使用'ref'关键字?

如果我将一个对象传递给一个方法,为什么我应该使用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”,这意味着该对象已作为参考传递。


如果您想更改对象的内容,请通过ref

TestRef t = new TestRef();
t.Something = "Foo";
DoSomething(ref t);

void DoSomething(ref TestRef t)
{
  t = new TestRef();
  t.Something = "Not just a changed t, but a completely different TestRef object";
}

在调用DoSomething之后, t不会引用原始的new TestRef ,而是指完全不同的对象。

如果你想改变一个不可变对象的值,例如一个string ,这可能也很有用。 创建完成后,您无法更改string的值。 但是通过使用ref ,你可以创建一个函数来改变另一个具有不同值的字符串。

编辑:正如其他人所说的。 除非需要使用ref否则不是一个好主意。 使用ref让方法自由地改变其他参数的参数,方法的调用者需要编码以确保他们处理这种可能性。

另外,当参数类型是对象时,对象变量总是作为对象的引用。 这意味着,当使用ref关键字时,您已经获得对引用的引用。 这允许您按照上面给出的示例中所述执行操作。 但是,当参数类型是原始值(例如int )时,如果在该方法内分配此参数,则在方法返回后传入的参数值将被更改:

int x = 1;
Change(ref x);
Debug.Assert(x == 5);
WillNotChange(x);
Debug.Assert(x == 5); // Note: x doesn't become 10

void Change(ref int x)
{
  x = 5;
}

void WillNotChange(int x)
{
  x = 10;
}

您需要区分“按值传递参考”和“按参考传递参数/参数”。

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


在.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; }
        }
    }
链接地址: http://www.djcxy.com/p/20997.html

上一篇: Why use the 'ref' keyword when passing an object?

下一篇: Array, String and .join( )