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");
}
}
Duplizieren http://stackoverflow.com/questions/373419/whats-the-difference-between-a-parameter-passed-by-reference-vs-passed-by-value –
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. –
@ 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