“ref”关键字和引用类型

时间:2011-01-11 09:41:59

标签: c# .net pass-by-reference ref reference-type

我的团队中的某个人偶然发现了在引用类型

上使用ref关键字的特殊情况
class A { /* ... */ } 

class B
{    
    public void DoSomething(ref A myObject)
    {
       // ...
    }
}

有理智的人会做出这样的事吗?我在C#

中找不到这个用途

4 个答案:

答案 0 :(得分:16)

仅当他们想要将引用更改为以myObject传递给另一个的对象时。

public void DoSomething(ref A myObject)
{
   myObject = new A(); // The object in the calling function is now the new one 
}

这可能不是他们想要做的事情,并且不需要ref

答案 1 :(得分:13)

class A
{
    public string Blah { get; set; }
}

void Do (ref A a)
{
    a = new A { Blah = "Bar" };
}

然后

A a = new A { Blah = "Foo" };
Console.WriteLine(a.Blah); // Foo
Do (ref a);
Console.WriteLine(a.Blah); // Bar

但如果只是

void Do (A a)
{
    a = new A { Blah = "Bar" };
}

然后

A a = new A { Blah = "Foo" };
Console.WriteLine(a.Blah); // Foo
Do (a);
Console.WriteLine(a.Blah); // Foo

答案 2 :(得分:0)

如果该方法应该更改传递给方法的变量中存储的引用,则ref关键字很有用。如果您不使用ref,则无法仅更改参考更改,对象本身将在方法外部可见。

this.DoSomething(myObject);
// myObject will always point to the same instance here

this.DoSomething(ref myObject);
// myObject could potentially point to a completely new instance here

答案 3 :(得分:0)

这没什么特别的。如果要从方法返回多个值,或者只是不想将返回值重新分配给作为参数传递的对象,则引用变量。

像这样:

int bar = 4;
foo(ref bar);

而不是:

int bar = 4;
bar = foo(bar);

或者,如果您想要检索多个值:

int bar = 0;
string foobar = "";
foo(ref bar, ref foobar);