2011-01-11 13 views
6

jemand in meinem Team auf einer eigentümlichen Verwendung des Schlüsselwort ref auf einem Referenz-Typ gestolpert„ref“ Stichwort und Referenztypen

class A { /* ... */ } 

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

Gibt es einen Grund jemand gesund würde so etwas tun? Ich kann keine Verwendung dafür finden in C#

+0

Siehe auch [diese Frage] (http: // stackoverflow.com/questions/961717/c-what-is-the-use-of-ref-for-referenz-type-variables). –

+0

Tatsächlich habe ich diese Frage beim Suchen verpasst. Guter Fang – Luk

Antwort

12

Lassen

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

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

dann

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

Aber wenn nur

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

dann

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

+1 für ein explizites Beispiel dessen, worüber Oded spricht, auch wenn es schon ziemlich klar war. –

+0

Vielen Dank, das macht es kristallklar! – Luk

+0

@Luk: Schön, dass es geholfen hat! :) – abatishchev

15

Nur wenn sie die Referenz auf das Objekt als myObject zu einem anderen übergeben möchten.

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

Die Chancen sind, ist dies nicht das, was sie tun wollen und ref ist nicht erforderlich.

0

Das Schlüsselwort ref ist nützlich, wenn die Methode den in der an die Methode übergebenen Variable gespeicherten Verweis ändern soll. Wenn Sie ref nicht verwenden, können Sie die Referenz nur ändern, wenn das Objekt selbst außerhalb der Methode sichtbar ist.

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 
0

Das ist nichts besonderes. Sie verweisen auf Variablen, wenn Sie mehrere Werte aus einer Methode zurückgeben wollen oder den Rückgabewert nicht dem Objekt übergeben möchten, das Sie als Argument übergeben haben.

So:

int bar = 4; 
foo(ref bar); 

statt:

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

Oder wenn Sie mehrere Werte abrufen möchten:

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

Tatsächlich spricht OP über Referenztypen, nicht Werttypen, wie 'int' – abatishchev

+0

Sie sagen also, dass Referenzen nicht mit Werttypen verwendet werden? – peterthegreat

+0

afaik, nein. Werttypen werden jedes Mal vollständig kopiert, d. h. nach Wert. deshalb werden sie Werttypen genannt – abatishchev