Gewusst wie: Unterschiede zwischen dem Übergeben einer Struktur und dem Übergeben eines Klassenverweises an eine Methode (C#-Programmierhandbuch)

Im folgenden Beispiel wird veranschaulicht, wie die Übergabe von Struktur einer Methode aus dem Übergeben einer Klasse-Instanz einer Methode unterscheidet. Im Beispiel werden beide Argumente (Struktur) und Klasseninstanz als Wert und beide Methoden ändern den Wert aus einem Feld des Arguments übergeben. Allerdings sind die Ergebnisse der beiden Methoden nicht identisch, da die übergebene übergeben, wenn Sie eine Struktur unterscheidet, die übergeben wird, wenn Sie eine Instanz einer Klasse übergeben.

Da eine Struktur Werttypist, wenn Sie Ausführen einer Struktur durch einen Wert auf eine Methode, die Methode eine Kopie der Struktur arguments empfangen und ausgeführt werden. Die Methode verfügt über keinen Zugriff auf die ursprüngliche Struktur in der aufrufenden Methode und kann daher in jeder Hinsicht ändern. Die Methode kann nur die Kopie ändern.

Eine Instanz einer Klasse, Verweistypist kein Werttyp. Wenn ein Referenztyp durch einen Wert übergeben wird auf eine Methode, die Methode eine Kopie des Verweises auf die Klasseninstanz empfängt. Das heißt, erhält die Methode eine Kopie der Adresse der Instanz keine Kopie der Instanz selbst. Die Klasseninstanz in der aufrufenden Methode verfügt über eine Adresse, hat der Parameter an die aufgerufene Methode eine Kopie der Adresse und beide dasselbe Objekt verweisen auf Adressen an. Da der Parameter nur eine Kopie der Adresse enthält, kann die aufgerufene Methode die Adresse der Klasseninstanz in der aufrufenden Methode nicht ändern. Allerdings kann die aufgerufene Methode die Adresse verwenden, um die Klassenmember zuzugreifen, die sowohl die ursprüngliche Adresse und die Kopie verweisen. Wenn die aufgerufene Methode einen Klassenmember ändert, ändert die ursprüngliche Klasseninstanz in der aufrufenden Methode.

Die Ausgabe des folgenden Beispiels veranschaulicht den Unterschied. Der Wert des Felds willIChange der Klasseninstanz wird durch den Aufruf der Methode ClassTaker geändert, da die Methode die Adresse im Parameter verwendet wird, um das angegebene Feld der Klasseninstanz zu suchen. Das willIChange Feld der Struktur in der aufrufenden Methode wird nicht durch den Aufruf der Methode StructTaker , da der Wert des Arguments eine Kopie der Struktur selbst ist keine Kopie der Adresse geändert. StructTaker ändert die Kopie und die Kopie geht verloren, wenn durch Aufruf von StructTaker abgeschlossen ist.

Beispiel

class TheClass
{
    public string willIChange;
}

struct TheStruct
{
    public string willIChange;
}

class TestClassAndStruct
{
    static void ClassTaker(TheClass c)
    {
        c.willIChange = "Changed";
    }

    static void StructTaker(TheStruct s)
    {
        s.willIChange = "Changed";
    }

    static void Main()
    {
        TheClass testClass = new TheClass();
        TheStruct testStruct = new TheStruct();

        testClass.willIChange = "Not Changed";
        testStruct.willIChange = "Not Changed";

        ClassTaker(testClass);
        StructTaker(testStruct);

        Console.WriteLine("Class field = {0}", testClass.willIChange);
        Console.WriteLine("Struct field = {0}", testStruct.willIChange);

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
/* Output:
    Class field = Changed
    Struct field = Not Changed
*/

Siehe auch

C#-Programmierhandbuch
Klassen
Strukturen
Übergeben von Parametern