In C#, alle Argumente zu Verfahren gesendet werden, vorbei von Wert, es sei denn, sie übergeben werden, indem entweder die ref
oder out
Schlüsselwörter.
Dies umfasst Argumente, die Werttypen, Referenztypen, veränderbare und unveränderliche Typen sind.
Wenn ein Referenzart Argument übergeben sich auf ein Verfahren, was tatsächlich passiert, ist, dass die Referenz des Arguments Wert von geben wird.
Dies bedeutet, dass das Verfahren eine neue Referenz auf das Argument gilt tatsächlich an sie übergibt.
Jede Änderung des Zustands dieses Arguments wird daher auch bei Verwendung der Referenz von außerhalb der Methode angezeigt.
Wenn Sie jedoch der Referenz innerhalb der Methode einen neuen Wert zuweisen, spiegelt sie die Referenz nicht außerhalb der Methode wider.
Für eine bessere, ausführlichere Erklärung, lesen Sie Jon Skeets Parameter passing in C# Artikel.
Sie können dies nicht mit einem unveränderlichen Typ testen, da unveränderliche Typen per Definition nicht geändert werden können.
Sie können jedoch testen diese mit jedem wandelbaren Typ:
public static void Main()
{
var x = new List<int>();
x.Add(1);
Add(x, 2);
Console.WriteLine(x.Count.ToString()); // will print "2";
AddRef(ref x, 3);
Console.WriteLine(x.Count.ToString()); // will print "1";
Add3(x, 1, 2, 3);
Console.WriteLine(x.Count.ToString()); // will also print "1";
Add3Ref(ref x, 1, 2, 3);
Console.WriteLine(x.Count.ToString()); // will print "3";
}
static void Add(List<int> list, int value)
{
// adding an item to the list, thus chaning the state of the list.
// this will reflect on the list sent to the method,
// since a List is a reference type.
list.Add(value);
}
static void AddRef(ref List<int> list, int value)
{
list = new List<int>(); // same as the s += “Hi”; in the question
// Adding the value to the list.
// Note that this change will reflect on the list passed to the method,
// since it is passed using the ref keyword.
list.Add(value);
}
static void Add3(List<int> list, int value1, int value2, int value3)
{
list = new List<int>(); // same as the s += “Hi”; in the question
// these values are added to the new list.
// since the reference to the list was passed by value,
// it WILL NOT effect the list sent to the method.
list.Add(value1);
list.Add(value2);
list.Add(value3);
}
static void Add3Ref(ref List<int> list, int value1, int value2, int value3)
{
list = new List<int>(); // same as the s += “Hi”; in the question
// these values are added to the new list.
// since the list was passed by reference,
// it WILL effect the list sent to the method.
list.Add(value1);
list.Add(value2);
list.Add(value3);
}
You can see for yourself on this fiddle.
's + = "Hallo";' ist eine Abkürzung für 's = s + "Hallo";'. Sie erstellen eine neue Zeichenfolge und nicht die vorhandene. Daher das Ergebnis, das Sie sehen –
Sie führt eine neue Referenzzeichenfolge "s" in der 'ChangeString()' Methode ein, so dass es sich von der Zeichenfolge 's' in der' main' Methode unterscheidet. Wenn Sie den vorhandenen mutieren wollten, hätten Sie 'ref' verwenden sollen. – denchu
[Vielleicht möchten Sie auch dies lesen] (http://stackoverflow.com/a/30369126/3094533) –