2009-08-18 7 views
6

Mögliche Duplizieren unterscheidet:
What’s the difference between a parameter passed by reference vs. passed by value?was zwischen Passing von Wert und Passing durch Bezugnahme mit C#

Ich habe Schwierigkeiten zu verstehen, den Unterschied zwischen vorbei Wert und vorbei Referenz. Kann jemand ein C# -Beispiel bereitstellen, das den Unterschied veranschaulicht?

+3

Duplizieren http://stackoverflow.com/questions/373419/whats-the-difference-between-a-parameter-passed-by-reference-vs-passed-by-value –

+2

Das ist * Art * ein Duplikat, aber das fragt speziell nach C# -Beispielen - obwohl es in der referenzierten Frage überhaupt keine C# -Beispiele gibt. Eine Menge guter * allgemeiner * Diskussionen, sicherlich, aber ich glaube nicht, dass es wirklich weh tut, sprachspezifische zu haben. –

+0

@ Jon Skeet: Ist nicht die richtige Lösung, um eine Antwort mit C# -Syntax in die bestehende Frage zu stecken? Vermutlich eine vorhandene Antwort bearbeiten. – dmckee

Antwort

16

Lesen Sie im Allgemeinen my article about parameter passing.

Die Grundidee ist:

Wenn das Argument als Referenz übergeben wird, ändert sich dann auf den Parameterwert innerhalb des Verfahrens wird auch das Argument beeinflussen.

Der feine Teil ist, dass, wenn der Parameter ein Referenz-Typ, dann tut:

someParameter.SomeProperty = "New Value"; 

nicht den Wert des Parameters zu ändern. Der Parameter ist nur eine Referenz, und das Obige ändert nicht, worauf sich der Parameter bezieht, sondern nur die Daten innerhalb des Objekts. Hier ist ein Beispiel von wirklich den Wert des Parameters zu ändern:

someParameter = new ParameterType(); 

Jetzt für Beispiele:

Einfaches Beispiel: ein int durch ref vorbei oder durch Wert

class Test 
{ 
    static void Main() 
    { 
     int i = 10; 
     PassByRef(ref i); 
     // Now i is 20 
     PassByValue(i); 
     // i is *still* 20 
    } 

    static void PassByRef(ref int x) 
    { 
     x = 20; 
    } 

    static void PassByValue(int x) 
    { 
     x = 50; 
    } 
} 

Kompliziertere Beispiel: Verwenden von Referenztypen

class Test 
{ 
    static void Main() 
    { 
     StringBuilder builder = new StringBuilder(); 
     PassByRef(ref builder); 
     // builder now refers to the StringBuilder 
     // constructed in PassByRef 

     PassByValueChangeContents(builder); 
     // builder still refers to the same StringBuilder 
     // but then contents has changed 

     PassByValueChangeParameter(builder); 
     // builder still refers to the same StringBuilder, 
     // not the new one created in PassByValueChangeParameter 
    } 

    static void PassByRef(ref StringBuilder x) 
    { 
     x = new StringBuilder("Created in PassByRef"); 
    } 

    static void PassByValueChangeContents(StringBuilder x) 
    { 
     x.Append(" ... and changed in PassByValueChangeContents"); 
    } 

    static void PassByValueChangeParameter(StringBuilder x) 
    { 
     // This new object won't be "seen" by the caller 
     x = new StringBuilder("Created in PassByValueChangeParameter"); 
    } 
} 
5

Übergabe als Wert bedeutet, dass eine Kopie eines Arguments übergeben wird. Änderungen an dieser Kopie ändern nicht das Original.

Durch Referenz gehen bedeutet, dass ein Verweis auf das Original übergeben wird und Änderungen an der Referenz das Original betreffen.

Dies ist nicht spezifisch für C#, es existiert in vielen Sprachen.

0

Der Digest ist:

Übergabe als Referenz verwendet, wenn Sie erwarten, dass die Funktion/Methode Ihre Variable zu ändern.

Übergabe von Wert, wenn Sie nicht tun.