C# &引用;参考「;关键字和引用类型

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) {

我的团队中有人偶然发现ref关键字在引用类型上的特殊用法

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);