Gewusst wie: Unterschiede zwischen dem Übergeben einer Struktur und dem Übergeben eines Klassenverweises an eine Methode (C#-Programmierhandbuch)How to: Know the Difference Between Passing a Struct and Passing a Class Reference to a Method (C# Programming Guide)

Das folgende Beispiel stellt dar, wie die Übergabe einer Struktur an eine Methode sich von der Übergabe einer Klasseninstanz an eine Methode unterscheidet.The following example demonstrates how passing a struct to a method differs from passing a class instance to a method. Im Beispiel werden beide Argumente (Struktur und Klasseninstanz) nach Wert übergeben, und beide Methoden ändern den Wert eines Felds des Arguments.In the example, both of the arguments (struct and class instance) are passed by value, and both methods change the value of one field of the argument. Allerdings sind die Ergebnisse der beiden Methoden nicht identisch, denn wenn Sie eine Struktur übergeben, unterscheidet sich dies von dem, wenn Sie eine Instanz einer Klasse übergeben.However, the results of the two methods are not the same because what is passed when you pass a struct differs from what is passed when you pass an instance of a class.

Da eine Struktur ein Werttyp ist, wenn Sie eine Struktur nach Wert an eine Methode übergeben, erhält und funktioniert die Methode nur mit einer Kopie des Strukturarguments.Because a struct is a value type, when you pass a struct by value to a method, the method receives and operates on a copy of the struct argument. Die Methode hat keinen Zugriff auf die ursprüngliche Struktur in der aufrufenden Methode und kann sie deshalb nicht ändern.The method has no access to the original struct in the calling method and therefore can't change it in any way. Die Methode kann nur die Kopie ändern.The method can change only the copy.

Eine Instanz der Klasse ist ein Verweistyp, kein Werttyp.A class instance is a reference type, not a value type. Wenn ein Verweistyp als Wert an eine Methode übergeben wird, erhält die Methode eine Kopie des Verweises auf die Klasseninstanz.When a reference type is passed by value to a method, the method receives a copy of the reference to the class instance. Die Methode erhält also eine Kopie der Adresse der Instanz, keine Kopie der Instanz selbst.That is, the method receives a copy of the address of the instance, not a copy of the instance itself. Die Klasseninstanz in der aufrufenden Methode verfügt über eine Adresse, der Parameter in der aufgerufenen Methode verfügt über eine Kopie der Adresse und beide Adressen verweisen auf dasselbe Objekt.The class instance in the calling method has an address, the parameter in the called method has a copy of the address, and both addresses refer to the same object. Da der Parameter nur eine Kopie der Adresse enthält, kann die aufgerufene Methode nicht die Adresse der Klasseninstanz in der aufrufenden Methode ändern.Because the parameter contains only a copy of the address, the called method cannot change the address of the class instance in the calling method. Allerdings kann die aufgerufene Methode die Adresse verwenden, um auf die Klassenmember zuzugreifen, auf die sich die ursprüngliche Adresse sowie die Kopie beziehen.However, the called method can use the address to access the class members that both the original address and the copy reference. Wenn die aufgerufene Methode einen Klassenmember ändert, ändert sich auch die ursprüngliche Klasseninstanz in der aufrufenden Methode.If the called method changes a class member, the original class instance in the calling method also changes.

Die Ausgabe des folgenden Beispiels veranschaulicht den Unterschied.The output of the following example illustrates the difference. Der Wert des Felds willIChange der Klasseninstanz wird durch den Aufruf auf die Methode ClassTaker geändert, da die Methode die Adresse im Parameter verwendet, um das angegebene Feld der Klasseninstanz zu finden.The value of the willIChange field of the class instance is changed by the call to method ClassTaker because the method uses the address in the parameter to find the specified field of the class instance. Das Feld willIChange der Struktur in der aufrufenden Methode wird nicht durch den Aufruf auf die Methode StructTaker geändert, da der Wert des Arguments eine Kopie der Struktur selbst ist und keine Kopie deren Adresse.The willIChange field of the struct in the calling method is not changed by the call to method StructTaker because the value of the argument is a copy of the struct itself, not a copy of its address. StructTaker ändert die Kopie, und die Kopie wird abgebrochen, wenn der Aufruf auf StructTaker abgeschlossen ist.StructTaker changes the copy, and the copy is lost when the call to StructTaker is completed.

BeispielExample

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 auchSee Also

C#-ProgrammierhandbuchC# Programming Guide
KlassenClasses
StrukturenStructs
Übergeben von ParameternPassing Parameters