Typen und VariablenTypes and variables

Es gibt zwei Arten von Typen in C#: Werttypen und Verweistypen.There are two kinds of types in C#: value types and reference types. Variablen von Werttypen enthalten ihre Daten direkt, Variablen von Verweistypen speichern hingegen Verweise auf ihre Daten – letztere werden als Objekte bezeichnet.Variables of value types directly contain their data whereas variables of reference types store references to their data, the latter being known as objects. Mit Verweistypen können zwei Variablen auf das gleiche Objekt verweisen, und so können an einer Variablen durchgeführte Vorgänge das Objekt beeinflussen, auf das die andere Variable verweist.With reference types, it is possible for two variables to reference the same object and thus possible for operations on one variable to affect the object referenced by the other variable. Bei Werttypen besitzt jede Variable eine eigene Kopie der Daten, und auf eine Variable angewendete Vorgänge können die andere Variable nicht beeinflussen (außer im Fall von ref- und out-Parametervariablen).With value types, the variables each have their own copy of the data, and it is not possible for operations on one to affect the other (except in the case of ref and out parameter variables).

C#-Werttypen sind weiter unterteilt in einfache Typen, Enumerationstypen, Strukturtypen und auf NULL festlegbare Werttypen.C#’s value types are further divided into simple types, enum types, struct types, and nullable value types. C#-Verweistypen sind weiter unterteilt in Klassentypen, Schnittstellentypen, Arraytypen und Delegattypen.C#’s reference types are further divided into class types, interface types, array types, and delegate types.

Im Folgenden finden Sie eine Übersicht des C#-Typsystems.The following provides an overview of C#’s type system.

  • WerttypenValue types
    • Einfache TypenSimple Types
      • Ganzzahlig mit Vorzeichen: sbyte, short, int,longSigned integral: sbyte, short, int, long
      • Ganzzahlig ohne Vorzeichen: byte, ushort, uint,ulongUnsigned integral: byte, ushort, uint, ulong
      • Unicode-Zeichen: charUnicode characters: char
      • IEEE-Gleitkomma: float, doubleIEEE floating point: float, double
      • Dezimalwert mit hoher Genauigkeit: decimalHigh-precision decimal: decimal
      • Boolesch: boolBoolean: bool
    • EnumerationstypenEnum types
      • Benutzerdefinierte Typen der Form enum E {...}User-defined types of the form enum E {...}
    • StrukturtypenStruct types
      • Benutzerdefinierte Typen der Form struct S {...}User-defined types of the form struct S {...}
    • Auf NULL festlegbare WerttypenNullable value types
      • Erweiterungen aller anderen Werttypen mit einem null-WertExtensions of all other value types with a null value
  • VerweistypenReference types
    • KlassentypenClass types
      • Ultimative Basisklasse aller anderen Typen:objectUltimate base class of all other types: object
      • Unicode-Zeichenfolgen: stringUnicode strings: string
      • Benutzerdefinierte Typen der Form class C {...}User-defined types of the form class C {...}
    • SchnittstellentypenInterface types
      • Benutzerdefinierte Typen der Form interface I {...}User-defined types of the form interface I {...}
    • ArraytypenArray types
      • Ein- und mehrdimensional, z.B. int[] undint[,]Single- and multi-dimensional, for example, int[] and int[,]
    • DelegattypenDelegate types
      • Benutzerdefinierte Typen der Form delegate int D(...)User-defined types of the form delegate int D(...)

Die acht Ganzzahltypen unterstützen 8-Bit-, 16-Bit, 32-Bit- und 64-Bit-Werte mit oder ohne Vorzeichen.The eight integral types provide support for 8-bit, 16-bit, 32-bit, and 64-bit values in signed or unsigned form.

Die zwei Gleitkommatypen float und double werden jeweils im 32-Bit-IEC-60559-Format mit einfacher Genauigkeit und 64-Bit-IEC-60559-Format mit doppelter Genauigkeit dargestellt.The two floating-point types, float and double, are represented using the 32-bit single-precision and 64-bit double-precision IEC-60559 formats, respectively.

Der decimal-Typ ist ein für Finanz-und Währungsberechnungen geeigneter 128-Bit-Datentyp.The decimal type is a 128-bit data type suitable for financial and monetary calculations.

Der bool-Typ von C# dient zur Darstellung boolescher Werte – Werte, die entweder true oder false sind.C#’s bool type is used to represent Boolean values—values that are either true or false.

Zur Zeichen- und Zeichenfolgenverarbeitung in C# wird die Unicode-Codierung verwendet.Character and string processing in C# uses Unicode encoding. Der char-Typ stellt eine UTF-16-Codeeinheit dar und der string-Typ eine Folge von UTF-16-Codeeinheiten.The char type represents a UTF-16 code unit, and the string type represents a sequence of UTF-16 code units.

Hier sind die numerischen Typen von C# zusammengefasst.This summarizes C#’s numeric types.

  • Ganzzahlig mit VorzeichenSigned Integral
    • sbyte: 8 Bit, Bereich von -128 - 127sbyte: 8 bits, range from -128 - 127
    • short: 16 Bit, Bereich von -32.768 - 32.767short: 16 bits, range from -32,768 - 32,767
    • int: 32 Bit, Bereich von -2.147.483.648 - 2.147.483.647int : 32 bits, range from -2,147,483,648 - 2,147,483,647
    • long: 64 Bit, Bereich von -9.223.372.036.854.775.808 bis 9.223.372.036.854.775.807long : 64 bits, range from –9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
  • Ganzzahlig ohne VorzeichenUnsigned integral
    • byte: 8 Bit, Bereich von 0 - 255byte : 8 bits, range from 0 - 255
    • ushort: 16 Bit, Bereich von 0 - 65.535ushort : 16 bits, range from 0 - 65,535
    • uint: 32 Bit, Bereich von 0 - 4.294.967.295uint : 32 bits, range from 0 - 4,294,967,295
    • ulong: 64 Bit, Bereich von -0 - 18.446.744.073.709.551.615ulong : 64 bits, range from 0 - 18,446,744,073,709,551,615
  • GleitkommaFloating point
    • float: 32 Bit, Bereich von 1,5 × 10-45 - 3,4 × 1038, Genauigkeit von 7 Stellenfloat : 32 bits, range from 1.5 × 10−45 - 3.4 × 1038, 7-digit precision
    • double: 64 Bit, Bereich von 5,0 × 10-324 - 1,7 × 10308, Genauigkeit von 15 Stellendouble : 64 bits, range from 5.0 × 10−324 - 1.7 × 10308, 15-digit precision
  • DecimalDecimal
    • decimal: 128 Bit, Bereich mindestens -7,9 × 10-28 - 7,9 x 1028 mit einer Genauigkeit von mindestens 28 Stellendecimal : 128 bits, range is at least –7.9 × 10−28 - 7.9 × 1028, with at least 28-digit precision

C#-Programme verwenden Typdeklarationen, um neue Typen zu erstellen.C# programs use type declarations to create new types. Eine Typdeklaration gibt den Namen und die Member des neuen Typs an.A type declaration specifies the name and the members of the new type. Fünf Typkategorien von C# sind benutzerdefinierbar: Klassentypen, Strukturtypen, Schnittstellentypen, Enumerationstypen und Delegattypen.Five of C#’s categories of types are user-definable: class types, struct types, interface types, enum types, and delegate types.

Ein class-Typ definiert eine Datenstruktur, die Datenmember (Felder) und Funktionsmember (Methoden, Eigenschaften usw.) enthält.A class type defines a data structure that contains data members (fields) and function members (methods, properties, and others). Klassentypen unterstützen einzelne Vererbung und Polymorphie. Dies sind Mechanismen, durch die abgeleitete Klassen erweitert und Basisklassen spezialisiert werden können.Class types support single inheritance and polymorphism, mechanisms whereby derived classes can extend and specialize base classes.

Ein struct-Typ ähnelt einem Klassentyp, da er eine Struktur mit Datenmembern und Funktionsmembern darstellt.A struct type is similar to a class type in that it represents a structure with data members and function members. Allerdings sind Strukturen im Gegensatz zu Klassen Werttypen und erfordern in der Regel keine Heapzuordnung.However, unlike classes, structs are value types and do not typically require heap allocation. Strukturtypen unterstützen keine benutzerdefinierte Vererbung, und alle Strukturtypen erben implizit vom Typ object.Struct types do not support user-specified inheritance, and all struct types implicitly inherit from type object.

Ein interface-Typ definiert einen Vertrag als benannter Satz öffentlicher Funktionsmember.An interface type defines a contract as a named set of public function members. Eine class oder struct, die eine interface implementiert, muss Implementierungen der Funktionsmember der Schnittstelle bereitstellen.A class or struct that implements an interface must provide implementations of the interface’s function members. Eine interface kann von mehreren Basisschnittstellen erben, und eine class oder struct kann mehrere Schnittstellen implementieren.An interface may inherit from multiple base interfaces, and a class or struct may implement multiple interfaces.

Ein delegate-Typ stellt Verweise auf Methoden mit einer bestimmten Parameterliste und dem Rückgabetyp dar.A delegate type represents references to methods with a particular parameter list and return type. Delegate ermöglichen die Behandlung von Methoden als Entitäten, die Variablen zugewiesen und als Parameter übergeben werden können.Delegates make it possible to treat methods as entities that can be assigned to variables and passed as parameters. Delegate werden analog zu Funktionstypen von funktionalen Sprachen bereitgestellt.Delegates are analogous to function types provided by functional languages. Sie ähneln auch dem Konzept von Funktionszeigern, die Sie in einigen anderen Sprachen finden. Im Gegensatz zu Funktionszeigern sind Delegate allerdings objektorientiert und typsicher.They are also similar to the concept of function pointers found in some other languages, but unlike function pointers, delegates are object-oriented and type-safe.

Die Typen, class, struct, interface und delegate unterstützen generische Typen, wobei sie mit anderen Typen parametrisiert werden können.The class, struct, interface and delegate types all support generics, whereby they can be parameterized with other types.

Ein enum-Typ ist ein eigenständiger Typ mit einer benannten Konstante.An enum type is a distinct type with named constants. Jeder enum-Typ verfügt über einen zugrunde liegenden Typ, der einer der acht ganzzahligen Typen sein muss.Every enum type has an underlying type, which must be one of the eight integral types. Der Satz von Werten eines enum-Typs ist mit dem Satz von Werten des zugrunde liegenden Typs identisch.The set of values of an enum type is the same as the set of values of the underlying type.

C# unterstützt ein- und mehrdimensionale Arrays beliebigen Typs.C# supports single- and multi-dimensional arrays of any type. Im Gegensatz zu den oben aufgeführten Typen müssen Arraytypen nicht deklariert werden, bevor sie verwendet werden können.Unlike the types listed above, array types do not have to be declared before they can be used. Stattdessen werden Arraytypen erstellt, indem hinter einen Typnamen eckige Klammern gesetzt werden.Instead, array types are constructed by following a type name with square brackets. Beispielsweise ist int[] ein eindimensionales Array von int, int[,] ein zweidimensionales Array von int und int[][] ein eindimensionales Array des eindimensionalen Arrays von int.For example, int[] is a single-dimensional array of int, int[,] is a two-dimensional array of int, and int[][] is a single-dimensional array of single-dimensional array of int.

Auf NULL festlegbare Werttypen müssen auch nicht deklariert werden, bevor sie verwendet werden können.Nullable value types also do not have to be declared before they can be used. Für jeden nicht auf NULL festlegbaren Werttypen T gibt es einen entsprechenden auf NULL festlegbaren Werttypen T?, der einen zusätzlichen Wert enthalten kann, null.For each non-nullable value type T there is a corresponding nullable value type T?, which can hold an additional value, null. Beispielsweise ist int? ein Typ, der jeden 32-Bit-Ganzzahlwert oder den Wert null enthalten kann.For instance, int? is a type that can hold any 32-bit integer or the value null.

Das C#-Typsystem ist dahingehend vereinheitlicht, dass ein Wert eines beliebigen Typs als object behandelt werden kann.C#’s type system is unified such that a value of any type can be treated as an object. Jeder Typ in C# ist direkt oder indirekt vom object-Klassentyp abgeleitet, und object ist die ultimative Basisklasse aller Typen.Every type in C# directly or indirectly derives from the object class type, and object is the ultimate base class of all types. Werte von Verweistypen werden als Objekte behandelt, indem die Werte einfach als Typ object angezeigt werden.Values of reference types are treated as objects simply by viewing the values as type object. Werte von Werttypen werden durch Ausführen von Boxing- und Unboxingvorgängen als Objekte behandelt.Values of value types are treated as objects by performing boxing and unboxing operations. Im folgenden Beispiel wird ein int-Wert in ein object und wieder in einen int-Wert konvertiert.In the following example, an int value is converted to object and back again to int.

using System;
class BoxingExample
{
    static void Main()
    {
        int i = 123;
        object o = i;    // Boxing
        int j = (int)o;  // Unboxing
    }
}

Wenn ein Wert eines Werttyps in den Typ object konvertiert wird, wird eine auch „Box“ genannte object-Instanz zum Speichern des Werts zugeordnet, und der Wert wird in diese Box kopiert.When a value of a value type is converted to type object, an object instance, also called a "box", is allocated to hold the value, and the value is copied into that box. Wenn umgekehrt ein object-Verweis in einen Werttyp umgewandelt wird, wird überprüft, ob das object, auf das verwiesen wird, eine Box des korrekten Datentyps ist, und bei erfolgreicher Überprüfung wird der Wert in der Box kopiert.Conversely, when an object reference is cast to a value type, a check is made that the referenced object is a box of the correct value type, and, if the check succeeds, the value in the box is copied out.

Aus dem einheitlichen C#-Typensystem resultiert, dass Werttypen „bei Nachfrage“ Objekte werden können.C#’s unified type system effectively means that value types can become objects "on demand." Aufgrund der Vereinheitlichung können Bibliotheken für allgemeine Zwecke, die den Typ object verwenden, sowohl mit Verweis- als auch Werttypen verwendet werden.Because of the unification, general-purpose libraries that use type object can be used with both reference types and value types.

Es gibt mehrere Arten von Variablen in C#, einschließlich Feldern, Arrayelementen, lokalen Variablen und Parametern.There are several kinds of variables in C#, including fields, array elements, local variables, and parameters. Variablen stellen Speicherorte dar, und jede Variable hat einen Typ, der bestimmt, welche Werte in der Variablen gespeichert werden können, wie unten gezeigt.Variables represent storage locations, and every variable has a type that determines what values can be stored in the variable, as shown below.

  • Nicht auf NULL festlegbarer WerttypNon-nullable value type
    • Ein Wert genau dieses TypsA value of that exact type
  • Auf NULL festlegbarer WerttypNullable value type
    • Ein null-Wert oder ein Wert genau dieses TypsA null value or a value of that exact type
  • objectobject
    • Ein null-Verweis, ein Verweis auf ein Objekt eines beliebigen Verweistyps oder ein Verweis auf einen geschachtelten Wert eines beliebigen WerttypsA null reference, a reference to an object of any reference type, or a reference to a boxed value of any value type
  • KlassentypClass type
    • Ein null-Verweis, ein Verweis auf eine Instanz dieses Klassentyps oder ein Verweis auf eine Instanz einer Klasse, die von diesem Klassentyp abgeleitet istA null reference, a reference to an instance of that class type, or a reference to an instance of a class derived from that class type
  • SchnittstellentypInterface type
    • Ein null-Verweis, ein Verweis auf eine Instanz eines Klassentyps, der diesen Schnittstellentyp implementiert, oder ein Verweis auf einen geschachtelten Wert eines Werttyps, der diesen Schnittstellentyp implementiertA null reference, a reference to an instance of a class type that implements that interface type, or a reference to a boxed value of a value type that implements that interface type
  • ArraytypArray type
    • Ein null-Verweis, ein Verweis auf eine Instanz dieses Arraytyps oder ein Verweis auf eine Instanz eines kompatiblen ArraytypsA null reference, a reference to an instance of that array type, or a reference to an instance of a compatible array type
  • DelegattypDelegate type
    • Ein null-Verweis oder ein Verweis auf eine Instanz eines kompatiblen DelegattypA null reference or a reference to an instance of a compatible delegate type