我的团队中的某个人偶然发现了在引用类型
上使用ref关键字的特殊情况class A { /* ... */ }
class B
{
public void DoSomething(ref A myObject)
{
// ...
}
}
有理智的人会做出这样的事吗?我在C#
中找不到这个用途答案 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);