C# &引用;参考「;关键字和引用类型
我的团队中有人偶然发现ref关键字在引用类型上的特殊用法C# &引用;参考「;关键字和引用类型,c#,.net,pass-by-reference,ref,reference-type,C#,.net,Pass By Reference,Ref,Reference Type,我的团队中有人偶然发现ref关键字在引用类型上的特殊用法 class A { /* ... */ } class B { public void DoSomething(ref A myObject) { // ... } } 有没有什么理由理智的人会做这样的事?只有当他们想将作为myObject传入的对象的引用更改为其他引用时,我才在C#中找不到这种用法 public void DoSomething(ref A myObject) {
class A { /* ... */ }
class B
{
public void DoSomething(ref A myObject)
{
// ...
}
}
有没有什么理由理智的人会做这样的事?只有当他们想将作为
myObject
传入的对象的引用更改为其他引用时,我才在C#中找不到这种用法
public void DoSomething(ref A myObject)
{
myObject = new A(); // The object in the calling function is now the new one
}
很可能这不是他们想要做的,也不需要ref
。让
class A
{
public string Blah { get; set; }
}
void Do (ref A a)
{
a = new A { Blah = "Bar" };
}
然后
但如果只是
void Do (A a)
{
a = new A { Blah = "Bar" };
}
然后
如果该方法要更改传递给该方法的变量中存储的引用,则
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
这没什么特别的。如果要从方法返回多个值,或者只是不想将返回值重新指定给作为参数传入的对象,则可以引用变量 像这样:
int bar = 4;
foo(ref bar);
而不是:
int bar = 4;
bar = foo(bar);
或者,如果要检索多个值:
int bar = 0;
string foobar = "";
foo(ref bar, ref foobar);
+1为Oded所说的一个明确的例子,即使它已经相当清楚了。非常感谢,这使它非常清楚@陆克文:很高兴这有帮助!:)事实上,OP谈论的是引用类型,而不是值类型,比如
int
,所以你是说引用不与值类型一起使用?好吧,不。值类型每次都被完全复制,即按值复制。这就是为什么它们被称为价值型。我理解你的意思。我从没想过OP用的是一个真实的物体。刚开始读的时候我很累,已经连续24个多小时没睡了。另请看。事实上,我在搜索时错过了那个问题。抢手货
int bar = 4;
bar = foo(bar);
int bar = 0;
string foobar = "";
foo(ref bar, ref foobar);