Typen, Variablen und WerteTypes, variables, and values

C# ist eine stark typisierte Sprache.C# is a strongly-typed language. Jede Variable und jede Konstante verfügt über einen Typ, genau wie jeder Ausdruck, der zu einem Wert ausgewertet wird.Every variable and constant has a type, as does every expression that evaluates to a value. Jede Methodensignatur gibt für jeden Eingabeparameter und den Rückgabewert einen Typ an.Every method signature specifies a type for each input parameter and for the return value. In der .NET Framework-Klassenbibliothek sind integrierte numerische Typen sowie komplexere Typen definiert, die eine große Anzahl logischer Konstrukte darstellen, z. B. das Dateisystem, Netzwerkverbindungen, Auflistungen und Arrays von Objekten sowie Datumsangaben.The .NET Framework class library defines a set of built-in numeric types as well as more complex types that represent a wide variety of logical constructs, such as the file system, network connections, collections and arrays of objects, and dates. In einem typischen C#-Programm werden Typen aus der Klassenbibliothek sowie benutzerdefinierte Typen verwendet, die die Konzepte für das Problemfeld des Programms modellieren.A typical C# program uses types from the class library as well as user-defined types that model the concepts that are specific to the program's problem domain.

Folgende Informationen können in einem Typ gespeichert sein:The information stored in a type can include the following:

  • Der Speicherplatz, den eine Variable des Typs erfordertThe storage space that a variable of the type requires.

  • Die maximalen und minimalen Werte, die diese darstellen kannThe maximum and minimum values that it can represent.

  • Die enthaltenen Member (Methoden, Felder, Ereignisse usw.)The members (methods, fields, events, and so on) that it contains.

  • Der Basistyp, von dem geerbt wirdThe base type it inherits from.

  • Die Position, an der der Arbeitsspeicher für Variablen zur Laufzeit belegt wirdThe location where the memory for variables will be allocated at run time.

  • Die Arten von zulässigen VorgängenThe kinds of operations that are permitted.

Der Compiler verwendet Typinformationen, um sicherzustellen, dass alle im Code ausgeführten Vorgänge typsicher sind.The compiler uses type information to make sure that all operations that are performed in your code are type safe. Wenn Sie z.B. eine Variable vom Typ int deklarieren, können Sie mit dem Compiler die Variable für Additions- und Subtraktionsvorgänge verwenden.For example, if you declare a variable of type int, the compiler allows you to use the variable in addition and subtraction operations. Wenn Sie dieselben Vorgänge für eine Variable vom Typ bool ausführen möchten, generiert der Compiler einen Fehler, wie im folgenden Beispiel dargestellt:If you try to perform those same operations on a variable of type bool, the compiler generates an error, as shown in the following example:

int a = 5;             
int b = a + 2; //OK

bool test = true;

// Error. Operator '+' cannot be applied to operands of type 'int' and 'bool'.
int c = a + test;

Hinweis

C- und C++-Entwickler sollten beachten, dass in C# bool nicht in int konvertiert werden kann.C and C++ developers, notice that in C#, bool is not convertible to int.

Der Compiler bettet die Typinformationen als Metadaten in die ausführbare Datei ein.The compiler embeds the type information into the executable file as metadata. Die Common Language Runtime (CLR) verwendet diese Metadaten zur Laufzeit, um die Typsicherheit zu gewährleisten, wenn Speicherplatz belegt und freigegeben wird.The common language runtime (CLR) uses that metadata at run time to further guarantee type safety when it allocates and reclaims memory.

Angeben von Typen in VariablendeklarationenSpecifying types in variable declarations

Wenn Sie eine Variable oder Konstante in einem Programm deklarieren, müssen Sie den Typ festlegen oder das var-Schlüsselwort verwenden, damit der Typ vom Compiler abgeleitet wird.When you declare a variable or constant in a program, you must either specify its type or use the var keyword to let the compiler infer the type. Im folgenden Beispiel werden einige Variablendeklarationen dargestellt, die sowohl integrierte numerische Typen als auch komplexe benutzerdefinierte Typen verwenden:The following example shows some variable declarations that use both built-in numeric types and complex user-defined types:

// Declaration only:
float temperature;
string name;
MyClass myClass;

// Declaration with initializers (four examples):
char firstLetter = 'C';
var limit = 3;
int[] source = { 0, 1, 2, 3, 4, 5 };
var query = from item in source
            where item <= limit
            select item;

Die Methodenparameter- und Rückgabewerttypen werden in der Methodensignatur angegeben.The types of method parameters and return values are specified in the method signature. Die folgende Signatur zeigt eine Methode, für die ein int als Eingabeargument benötigt wird und die eine Zeichenfolge zurückgibt:The following signature shows a method that requires an int as an input argument and returns a string:

public string GetName(int ID)
{
    if (ID < names.Length)
        return names[ID];
    else
        return String.Empty;
}
private string[] names = { "Spencer", "Sally", "Doug" };

Nachdem eine Variable deklariert wurde, kann sie nicht erneut mit einem neuen Typ deklariert werden. Außerdem kann ihr kein Wert zugewiesen werden, der nicht mit dem deklarierten Typ kompatibel ist.After a variable is declared, it cannot be re-declared with a new type, and it cannot be assigned a value that is not compatible with its declared type. Zum Beispiel können Sie eine int nicht deklarieren und dieser dann den booleschen Wert true zuweisen.For example, you cannot declare an int and then assign it a Boolean value of true. Werte können jedoch in andere Typen konvertiert werden, z. B., wenn diese neuen Variablen zugewiesen oder als Methodenargumente übergeben werden.However, values can be converted to other types, for example when they are assigned to new variables or passed as method arguments. Eine Typkonvertierung, die keinen Datenverlust verursacht, wird automatisch vom Compiler ausgeführt.A type conversion that does not cause data loss is performed automatically by the compiler. Eine Konvertierung, die möglicherweise Datenverlust verursacht, erfordert eine Umwandlung in den Quellcode.A conversion that might cause data loss requires a cast in the source code.

Weitere Informationen finden Sie unter Umwandlung und Typkonvertierungen.For more information, see Casting and type conversions.

Integrierte TypenBuilt-in types

C# liefert einen Standardsatz mit integrierten numerischen Typen zur Darstellung von ganzen Zahlen, Gleitkommawerten, booleschen Ausdrücken, Textzeichen, Dezimalwerten und anderen Datentypen.C# provides a standard set of built-in numeric types to represent integers, floating point values, Boolean expressions, text characters, decimal values, and other types of data. Es gibt auch integrierte Zeichenfolgen- und Objekt-Typen.There are also built-in string and object types. Diese können Sie in jedem C#-Programm verwenden.These are available for you to use in any C# program. Weitere Informationen über die integrierten Typen finden Sie unter Referenztabellen für Typen.For a more information about the built-in types, see Reference table for types.

Benutzerdefinierte TypenCustom types

Sie können die Konstrukte struct, class, interface und enum verwenden, um eigene benutzerdefinierte Typen zu erstellen.You use the struct, class, interface, and enum constructs to create your own custom types. Die .NET Framework-Klassenbibliothek ist eine Auflistung benutzerdefinierter, von Microsoft bereitgestellter Typen, die Sie in Ihren eigenen Anwendungen verwenden können.The .NET Framework class library itself is a collection of custom types provided by Microsoft that you can use in your own applications. Standardmäßig sind die am häufigsten verwendeten Typen in der Klassenbibliothek in jedem C#-Programm verfügbar.By default, the most frequently used types in the class library are available in any C# program. Andere stehen nur zur Verfügung, wenn Sie ausdrücklich einen Projektverweis auf die Assembly hinzufügen, in der diese definiert sind.Others become available only when you explicitly add a project reference to the assembly in which they are defined. Wenn der Compiler über einen Verweis auf die Assembly verfügt, können Sie Variablen (und Konstanten) des in dieser Assembly deklarierten Typs im Quellcode deklarieren.After the compiler has a reference to the assembly, you can declare variables (and constants) of the types declared in that assembly in source code.

Generische TypenGeneric types

Ein Typ kann mit einem oder mehreren Typparametern deklariert werden, die als Platzhalter für den eigentlichen Typ verwendet werden (den konkreten Typ), der vom Clientcode beim Erstellen einer Instanz des Typs bereitgestellt wird.A type can be declared with one or more type parameters that serve as a placeholder for the actual type (the concrete type) that client code will provide when it creates an instance of the type. Solche Typen werden als generische Typen bezeichnet.Such types are called generic types. Beispielsweise besitzt der .NET Framework-Typ List<T> einen Typparameter, dem üblicherweise der Name T gegeben wird. Beim Erstellen einer Instanz des Typs geben Sie die Objekte an, die die Liste enthalten soll, z. B. string:For example, the .NET Framework type List<T> has one type parameter that by convention is given the name T. When you create an instance of the type, you specify the type of the objects that the list will contain, for example, string:

List<string> strings = new List<string>();

Die Verwendung des Typparameters ermöglicht die Wiederverwendung der Klasse für beliebige Elementtypen, ohne die einzelnen Elemente in object konvertieren zu müssen.The use of the type parameter makes it possible to reuse the same class to hold any type of element, without having to convert each element to object. Generische Auflistungsklassen werden als stark typisierte Auflistungen bezeichnet, weil der Compiler den jeweiligen Typ der Elemente in der Auflistung kennt und zur Kompilierzeit einen Fehler auslösen kann, wenn Sie beispielsweise versuchen, dem strings-Objekt im vorherigen Beispiel eine ganze Zahl hinzuzufügen.Generic collection classes are called strongly-typed collections because the compiler knows the specific type of the collection's elements and can raise an error at compile-time if, for example, you try to add an integer to the strings object in the previous example. Weitere Informationen finden Sie unter Generika.For more information, see Generics.

Implizite Typen, anonyme Typen und Tupel-TypenImplicit types, anonymous types, and tuple types

Wie bereits zuvor erläutert, können Sie eine lokale Variable (jedoch keine Klassenmember) implizit eingeben, indem Sie das var-Schlüsselwort verwenden.As stated previously, you can implicitly type a local variable (but not class members) by using the var keyword. Die Variable erhält weiterhin zur Kompilierzeit einen Typ, aber der Typ wird vom Compiler bereitgestellt.The variable still receives a type at compile time, but the type is provided by the compiler. Weitere Informationen finden Sie unter Implizit typisierte lokale Variablen.For more information, see Implicitly typed local variables.

In einigen Fällen ist es unpraktisch, einen benannten Typ für einfache Sätze verwandter Werte zu erstellen, die nicht außerhalb von Methodengrenzen gespeichert oder übergeben werden sollen.In some cases, it is inconvenient to create a named type for simple sets of related values that you do not intend to store or pass outside method boundaries. Sie können für diesen Zweck anonyme Typen erstellen.You can create anonymous types for this purpose. Weitere Informationen finden Sie unter Anonyme Klassentypen.For more information, see Anonymous types.

Es ist üblich, mehr als einen Wert aus einer Methode zurückgeben zu wollen.It's common to want to return more than one value from a method. Sie können Tupeltypen erstellen, die mehrere Werte in einem Methodenaufruf zurückgeben.You can create tuple types that return multiple values in a single method call. Weitere Informationen finden Sie unter TupelFor more information, see Tuples

Das allgemeine TypsystemThe Common type system

Sie sollten mit zwei grundlegenden Punkten des Typsystems in .NET Framework vertraut sein:It is important to understand two fundamental points about the type system in the .NET Framework:

  • Es unterstützt das Prinzip der Vererbung.It supports the principle of inheritance. Typen können von anderen Typen abgeleitet werden, die als Basistypen bezeichnet werden.Types can derive from other types, called base types. Der abgeleitete Typ erbt (mit einigen Beschränkungen) die Methoden, Eigenschaften und anderen Member des Basistyps.The derived type inherits (with some restrictions) the methods, properties, and other members of the base type. Der Basistyp kann wiederum von einem anderen Typ abgeleitet sein. In diesem Fall erbt der abgeleitete Typ die Member beider Basistypen in der Vererbungshierarchie.The base type can in turn derive from some other type, in which case the derived type inherits the members of both base types in its inheritance hierarchy. Alle Typen, einschließlich integrierter numerischer Typen, z.B. Int32 (C#-Schlüsselwort: int), werden letztendlich von einem einzelnen Basistyp abgeleitet, nämlich Object (C#-Schlüsselwort: object).All types, including built-in numeric types such as Int32 (C# keyword: int), derive ultimately from a single base type, which is Object (C# keyword: object). Diese einheitliche Typhierarchie wird als Allgemeines Typsystem (Common Type System – CTS) bezeichnet.This unified type hierarchy is called the Common type system (CTS). Weitere Informationen zur Vererbung in C# finden Sie unter Vererbung.For more information about inheritance in C#, see Inheritance.

  • Jeder Typ im CTS ist als Werttyp oder Referenztyp definiert.Each type in the CTS is defined as either a value type or a reference type. Dies betrifft auch alle benutzerdefinierten Typen in der .NET Framework-Klassenbibliothek und Ihre eigenen benutzerdefinierten Typen.This includes all custom types in the .NET Framework class library and also your own user-defined types. Typen, die Sie mithilfe des struct-Schlüsselworts definieren, sind Werttypen. Alle integrierten numerischen Typen sind structs.Types that you define by using the struct keyword are value types; all the built-in numeric types are structs. Weitere Informationen über Werttypen finden Sie unter Structs.For more information about value types, see Structs. Typen, die Sie mithilfe des class-Schlüsselworts definieren, sind Referenztypen.Types that you define by using the class keyword are reference types. Weitere Informationen über Referenztypen finden Sie unter Classes.For more information about reference types, see Classes. Für Referenztypen und Werttypen gelten unterschiedliche Kompilierzeitregeln und ein anderes Laufzeitverhalten.Reference types and value types have different compile-time rules, and different run-time behavior.

Siehe auchSee also

Strukturen KlassenStructs Classes