StrukturenStructs

Eine Struktur ist ein Werttyp.A struct is a value type. Wenn eine Struktur erstellt wird, enthält die Variable, der die Struktur zugewiesen wird, die eigentlichen Daten der Struktur.When a struct is created, the variable to which the struct is assigned holds the struct's actual data. Wenn die Struktur einer neuen Variable zugewiesen wird, werden diese kopiert.When the struct is assigned to a new variable, it is copied. Die neue Variable und die ursprüngliche Variable enthalten daher zwei separate Kopien der gleichen Daten.The new variable and the original variable therefore contain two separate copies of the same data. Änderungen an einer Kopie wirken sich nicht auf die andere Kopie aus.Changes made to one copy do not affect the other copy.

Werttypvariablen enthalten die zugehörigen Werte direkt, d. h., der Speicher wird inline in dem Kontext belegt, in dem die Variable deklariert ist.Value type variables directly contain their values, which means that the memory is allocated inline in whatever context the variable is declared. Für Werttypvariablen erfolgt keine getrennte Heapzuordnung oder ein Mehraufwand für die Garbage Collection.There is no separate heap allocation or garbage collection overhead for value-type variables.

Zwei Kategorien von Werttypen sind verfügbar: struct und enum.There are two categories of value types: struct and enum.

Die integrierten numerischen Typen sind Strukturen und verfügen über Eigenschaften und Methoden, auf die Sie zugreifen können:The built-in numeric types are structs, and they have properties and methods that you can access:

// Static method on type Byte.  
byte b = Byte.MaxValue;

Sie deklarieren diese jedoch und weisen ihnen Werte zu, als wären es einfache, nicht aggregierte Typen:But you declare and assign values to them as if they were simple non-aggregate types:

byte num = 0xA;  
int i = 5;  
char c = 'Z';

Werttypen sind versiegelt (sealed). Dies bedeutet z.B., dass Sie keinen Typ von Int32 ableiten können und dass eine Struktur nicht von einer benutzerdefinierten Klasse oder Struktur erben kann, weil eine Struktur nur von ValueType erben kann.Value types are sealed, which means, for example, that you cannot derive a type from Int32, and you cannot define a struct to inherit from any user-defined class or struct because a struct can only inherit from ValueType. Eine Struktur kann jedoch eine oder mehrere Schnittstellen implementieren.However, a struct can implement one or more interfaces. Sie können einen Strukturtyp in einen Schnittstellentyp umwandeln. Dadurch wird ein Boxing-Vorgang gestartet, mit dem die Struktur von einem Referenztypobjekt im verwalteten Heap umschlossen wird.You can cast a struct type to an interface type; this causes a boxing operation to wrap the struct inside a reference type object on the managed heap. Boxing-Vorgänge werden auch ausgeführt, wenn Sie einen Werttyp an eine Methode übergeben, die Object als Eingabeparameter akzeptiert.Boxing operations occur when you pass a value type to a method that takes an Object as an input parameter. Weitere Informationen finden Sie unter Boxing und Unboxing.For more information, see Boxing and Unboxing.

Sie können das struct-Schlüsselwort verwenden, um eigene benutzerdefinierte Werttypen zu erstellen.You use the struct keyword to create your own custom value types. In der Regel wird eine Struktur als Container für einen kleinen Satz verwandter Variablen verwendet, wie im folgenden Beispiel dargestellt:Typically, a struct is used as a container for a small set of related variables, as shown in the following example:

public struct CoOrds
{
    public int x, y;

    public CoOrds(int p1, int p2)
    {
        x = p1;
        y = p2;
    }
}

Weitere Informationen über Werttypen im .NET Framework finden Sie unter Allgemeines Typsystem.For more information about value types in the .NET Framework, see Common Type System.

Strukturen teilen sich einen großen Teil der Syntax mit Klassen, obwohl Strukturen eingeschränkter als Klassen sind:Structs share most of the same syntax as classes, although structs are more limited than classes:

  • Innerhalb einer Strukturdeklaration können Felder nicht initialisiert werden, außer Sie werden als const oder static deklariert.Within a struct declaration, fields cannot be initialized unless they are declared as const or static.

  • Eine Struktur kann keinen Standardkonstruktor (ein Konstruktor ohne Parameter) oder Finalizer deklarieren.A struct cannot declare a default constructor (a constructor without parameters) or a finalizer.

  • Strukturen werden bei Zuweisung kopiert.Structs are copied on assignment. Wenn eine Struktur einer neuen Variable zugewiesen wird, werden alle Daten kopiert, und jede Änderung an der neuen Kopie ändert nicht die Daten für das Original.When a struct is assigned to a new variable, all the data is copied, and any modification to the new copy does not change the data for the original copy. Es ist wichtig, sich das zu merken, wenn Sie mit Auflistungen von Wertetypen wie Dictionary<string, myStruct> arbeiten.This is important to remember when working with collections of value types such as Dictionary<string, myStruct>.

  • Strukturen sind Werttypen, und Klassen sind Verweistypen.Structs are value types and classes are reference types.

  • Strukturen können im Gegensatz zu Klassen ohne den Operator new instanziiert werden.Unlike classes, structs can be instantiated without using a new operator.

  • Strukturen können Konstruktoren deklarieren, die Parameter besitzen.Structs can declare constructors that have parameters.

  • Eine Struktur kann nicht von einer anderen Struktur oder Klasse erben, und sie kann auch nicht die Basis einer Klasse sein.A struct cannot inherit from another struct or class, and it cannot be the base of a class. Alle Strukturen erben direkt von ValueType, das von Object erbt.All structs inherit directly from ValueType, which inherits from Object.

  • Eine Struktur kann Schnittstellen implementieren.A struct can implement interfaces.

LiteralwerteLiteral values

In C# erhalten Literalwerte einen Typ vom Compiler.In C#, literal values receive a type from the compiler. Sie können festlegen, wie ein numerisches Literal eingegeben werden soll, indem Sie am Ende der Zahl einen Buchstaben anfügen.You can specify how a numeric literal should be typed by appending a letter to the end of the number. Um z. B. anzugeben, dass der Wert 4.56 als Gleitkommazahl behandelt werden soll, fügen Sie nach der Zahl 4.56f ein "f" oder "F" an:For example, to specify that the value 4.56 should be treated as a float, append an "f" or "F" after the number: 4.56f. Wenn kein Buchstabe angefügt wird, leitet der Compiler den double-Typ für das Literal ab.If no letter is appended, the compiler will infer the double type for the literal. Weitere Informationen darüber, welche Typen mit Buchstabensuffixen angegeben werden können, finden Sie auf den Referenzseiten für einzelne Typen unter Werttypen.For more information about which types can be specified with letter suffixes, see the reference pages for individual types in Value Types.

Da Literale typisiert sind und alle Typen letztlich von Object abgeleitet werden, können Sie Code der folgenden Art erstellen und kompilieren:Because literals are typed, and all types derive ultimately from Object, you can write and compile code such as the following:

string s = "The answer is " + 5.ToString();
// Outputs: "The answer is 5"
Console.WriteLine(s);

Type type = 12345.GetType();
// Outputs: "System.Int32"
Console.WriteLine(type);

var x = 123_456;
string s2 = "I can use an underscore as a digit separator: " + x;
// Outputs: "I can use an underscore as a digit separator: 
Console.WriteLine(s2);

var b = 0b1010_1011_1100_1110_1111;
string s3 = "I can specify bit patterns: " + b.ToString();
// Outputs: "I can specify bit patterns: 703727
Console.WriteLine(s3);

Die letzten beiden Beispiele veranschaulichen die Sprachfunktionen, die in C# 7.0 eingeführt wurden.The last two examples demonstrate language features introduced in C# 7.0. Mit dem Ersten können Sie ein Unterstrichzeichen als eine Zeichentrennlinie in numerischen Literalen verwenden.The first allows you to use an underscore character as a digit separator inside numeric literals. Sie können es beliebig zwischen Zahlen setzen, um die Lesbarkeit zu verbessern.You can put them wherever you want between digits to improve readability. Es hat keine Auswirkung auf den Wert.They have no effect on the value.

Im zweiten Beispiel werden binäre Literale veranschaulicht, mit denen Sie ein Bitmuster direkt angeben können, anstatt Hexadezimalnotation zu verwenden.The second demonstrates binary literals, which allow you to specify bit patterns directly instead of using hexadecimal notation.

Auf NULL festlegbare TypenNullable types

Gewöhnliche Werttypen können den Wert NULL nicht aufweisen.Ordinary value types cannot have a value of null. Sie können jedoch auf NULL festlegbare Werttypen erstellen, indem Sie ein ?However, you can create nullable value types by affixing a ? nach dem Typ anfügen.after the type. Zum Beispiel ist int? ein int-Typ, der auch den Wert NULL haben kann.For example, int? is an int type that can also have the value null. Im CTS sind Typen, die NULL-Werte zulassen, Instanzen vom generischen Strukturtyp Nullable<T>.In the CTS, nullable types are instances of the generic struct type Nullable<T>. Typen, die NULL-Werte zulassen, sind besonders hilfreich, wenn Sie Daten an und aus Datenbanken übergeben, in denen die numerischen Werte NULL sein können.Nullable types are especially useful when you are passing data to and from databases in which numeric values might be null. Weitere Informationen finden Sie unter Typen, die NULL-Werte zulassen (C#-Programmierhandbuch).For more information, see Nullable Types (C# Programming Guide).

Siehe auchSee also

KlassenClasses

Grundlegende TypenBasic Types