Suche…


Bemerkungen

Normalerweise wird eine struct nur verwendet, wenn die Leistung sehr wichtig ist. Da Werttypen auf dem Stapel leben, kann auf sie viel schneller zugegriffen werden als auf Klassen. Der Stapel hat jedoch viel weniger Speicherplatz als der Heap, daher sollten die struct klein gehalten werden (Microsoft empfiehlt, dass die struct nicht mehr als 16 Byte beansprucht).

Eine class ist der meistgenutzte (von diesen drei) Typ in C # und sollte im Allgemeinen zuerst verwendet werden.

Eine enum wird immer dann verwendet, wenn Sie eine klar definierte, eindeutige Liste von Elementen haben, die nur einmal (zur Kompilierzeit) definiert werden müssen. Enumerationen sind für Programmierer hilfreich als einfache Referenz für einen bestimmten Wert: Anstatt eine Liste von constant Variablen für den Vergleich zu definieren, können Sie eine Enumeration verwenden und die Intellisense-Unterstützung in Anspruch nehmen, um sicherzustellen, dass Sie nicht versehentlich einen falschen Wert verwenden.

Strukturdefinition

Strukturen, die von System.ValueType erben, sind Werttypen und leben auf dem Stack. Wenn Werttypen als Parameter übergeben werden, werden sie als Wert übergeben.

Struct MyStruct
{
    public int x;
    public int y;
}

Übergeben durch Wert bedeutet, dass der Wert des Parameters für die Methode kopiert wird und Änderungen, die an dem Parameter in der Methode vorgenommen werden, nicht außerhalb der Methode angezeigt werden. Betrachten Sie zum Beispiel den folgenden Code, der eine Methode namens AddNumbers , die die Variablen a und b übergibt, die vom Typ int sind, also vom Typ Value.

int a = 5;
int b = 6;

AddNumbers(a,b);

public AddNumbers(int x, int y)
{
    int z = x + y; // z becomes 11
    x = x + 5; // now we changed x to be 10
    z = x + y; // now z becomes 16
} 

Auch wenn wir 5 bis hinzugefügt x innerhalb der Methode, der Wert von a bleibt unverändert, da es sich um ein Werttyp ist, und das bedeutet , x eine Kopie war a ‚s - Wert, aber nicht wirklich a .

Denken Sie daran, dass Werttypen auf dem Stapel leben und als Wert übergeben werden.

Klassendefinition

Klassen, die von System.Object erben, sind Referenztypen und leben auf dem Heap. Wenn Referenztypen als Parameter übergeben werden, werden sie als Referenz übergeben.

public Class MyClass
{
    public int a;
    public int b;
}

Übergeben als Referenz bedeutet, dass eine Referenz auf den Parameter an die Methode übergeben wird und alle Änderungen an dem Parameter bei der Rückgabe außerhalb der Methode angezeigt werden, da die Referenz auf dasselbe Objekt im Speicher verweist. Verwenden wir dasselbe Beispiel wie zuvor, aber wir "wickeln" die int s zuerst in einer Klasse.

MyClass instanceOfMyClass = new MyClass();
instanceOfMyClass.a = 5;
instanceOfMyClass.b = 6;

AddNumbers(instanceOfMyClass);

public AddNumbers(MyClass sample)
{
    int z = sample.a + sample.b; // z becomes 11
    sample.a = sample.a + 5; // now we changed a to be 10
    z = sample.a + sample.b; // now z becomes 16
} 

Dieses Mal, wenn wir geändert sample.a bis 10 , der Wert von instanceOfMyClass.a ändert sich auch, weil sie als Referenz übergeben wurde. Übergeben durch Referenz bedeutet, dass eine Referenz (manchmal auch als Zeiger bezeichnet ) auf das Objekt anstelle einer Kopie des Objekts selbst an die Methode übergeben wurde.

Denken Sie daran, dass Verweistypen auf dem Heap leben und als Verweise übergeben werden.

Aufzählungsdefinition

Eine Enumeration ist eine besondere Klasse. Das Schlüsselwort enum teilt dem Compiler mit, dass diese Klasse von der abstrakten System.Enum-Klasse erbt. Aufzählungen werden für verschiedene Listen von Elementen verwendet.

public enum MyEnum
{
    Monday = 1,
    Tuesday,
    Wednesday,
    //...
}

Sie können sich eine Aufzählung als eine bequeme Möglichkeit vorstellen, Konstanten einem zugrunde liegenden Wert zuzuordnen. Die oben definierte Aufzählung deklariert Werte für jeden Wochentag und beginnt mit 1 . Tuesday würde dann automatisch auf 2 abgebildet, Wednesday auf 3 usw.

Standardmäßig verwenden Aufzählungen int als zugrunde liegenden Typ und beginnen bei 0, Sie können jedoch einen der folgenden ganzzahligen Typen verwenden : byte, sbyte, short, ushort, int, uint, long, or ulong und können explizite Werte für any angeben Artikel. Wenn einige Elemente explizit angegeben sind, andere jedoch nicht, wird jedes Element nach dem zuletzt definierten Element um 1 erhöht.

Wir würden dieses Beispiel verwenden , indem Sie einen anderen Wert zu einem MyEnum wie so Gießen:

MyEnum instance = (MyEnum)3; // the variable named 'instance' gets a 
                             //value of MyEnum.Wednesday, which maps to 3.

int x = 2;
instance = (MyEnum)x; // now 'instance' has a value of MyEnum.Tuesday

Eine andere nützliche, wenn auch komplexere Art der Aufzählung wird Flags . Durch das Dekorieren einer Aufzählung mit dem Flags Attribut können Sie einer Variablen mehrere Werte gleichzeitig zuweisen. Beachten Sie, dass Sie dabei explizit Werte in der Basis-2-Darstellung definieren müssen .

[Flags]
public enum MyEnum
{
    Monday = 1,
    Tuesday = 2,
    Wednesday = 4,
    Thursday = 8,
    Friday = 16,
    Saturday = 32, 
    Sunday = 64
}

Jetzt können Sie mehr als einen Wert gleichzeitig vergleichen, entweder mit bitweisen Vergleichen oder, wenn Sie .NET 4.0 oder höher verwenden, die integrierte Enum.HasFlag Methode.

MyEnum instance = MyEnum.Monday | MyEnum.Thursday; // instance now has a value of
                                                   // *both* Monday and Thursday,
                                                   // represented by (in binary) 0100. 

if (instance.HasFlag(MyEnum.Wednesday))
{
    // it doesn't, so this block is skipped
}
else if (instance.HasFlag(MyEnum.Thursday))
{
    // it does, so this block is executed
}

Da die Enum-Klasse von System.ValueType , wird sie als System.ValueType behandelt und als Wert übergeben, nicht als Referenz. Das Basisobjekt wird auf dem Heap erstellt. Wenn Sie jedoch einen Aufzählungswert an einen Funktionsaufruf übergeben, wird eine Kopie des Werts mit dem zugrunde liegenden Wertetyp der Aufzählung (normalerweise System.Int32) in den Stapel geschrieben. Der Compiler verfolgt die Zuordnung zwischen diesem Wert und dem Basisobjekt, das auf dem Stapel erstellt wurde. Weitere Informationen finden Sie unter ValueType-Klasse (System) (MSDN) .



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow