“ref”关键字和引用类型[重复]

Posted

技术标签:

【中文标题】“ref”关键字和引用类型[重复]【英文标题】:"ref" keyword and reference types [duplicate] 【发布时间】:2011-06-07 01:42:26 【问题描述】:

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

class A  /* ... */  

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

有任何理智的人会做这种事的理由吗?我在 C# 中找不到它的用途

【问题讨论】:

另见this question。 确实,我在搜索时错过了这个问题。好收获 【参考方案1】:

仅当他们想要将作为myObject 传入的对象的引用更改为其他对象时。

public void DoSomething(ref A myObject)

   myObject = new A(); // The object in the calling function is now the new one 

这可能不是他们想要做的,也不需要ref

【讨论】:

【参考方案2】:

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

【讨论】:

+1 是关于 Oded 所谈论内容的明确示例,即使它已经相当清楚了。 非常感谢,这一切都清楚了! @Luk:很高兴它有帮助! :)【参考方案3】:

如果方法应该更改存储在传递给方法的变量中的引用,则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

【讨论】:

【参考方案4】:

这并没有什么特别之处。如果您想从一个方法返回多个值,或者只是不想将返回值重新分配给您作为参数传入的对象,您可以引用变量。

像这样:

int bar = 4;
foo(ref bar);

代替:

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

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

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

【讨论】:

其实OP讲的是引用类型,不是值类型,比如int 所以你是说引用不与值类型一起使用? afaik,没有。值类型每次都被完全复制,即按值。这就是为什么它们被称为值类型 现在我明白你的意思了。我从没想过 OP 使用了一个实际的对象。一开始读它时我很累,连续 24 小时以上。

以上是关于“ref”关键字和引用类型[重复]的主要内容,如果未能解决你的问题,请参考以下文章

将 ref 关键字与引用类型参数一起使用有啥好处?

C#使用引用参数[重复]

ref和out

c#传递引用对象作为参数的时候就没有必要用ref关键字,对吗

对象和类型(数组refout)

ref和out的区别,值类型和引用类型的使用