Klassen und Strukturen (C#-Programmierhandbuch)Classes and Structs (C# Programming Guide)

Klassen und Strukturen sind zwei der grundlegenden Konstrukte des allgemeinen Typsystems in .NET Framework.Classes and structs are two of the basic constructs of the common type system in the .NET Framework. Bei beiden handelt es sich um eine Datenstruktur, die einen als logische Einheit zusammengehörenden Satz von Daten und Verhalten kapselt.Each is essentially a data structure that encapsulates a set of data and behaviors that belong together as a logical unit. Die Daten und die Verhalten sind die Member der Klasse oder Struktur. Diese enthalten deren Methoden, Eigenschaften, Ereignisse usw., die weiter unten in diesem Thema aufgeführt werden.The data and behaviors are the members of the class or struct, and they include its methods, properties, and events, and so on, as listed later in this topic.

Die Deklaration einer Klasse oder Struktur ist mit einem Entwurf vergleichbar, mit dem zur Laufzeit Instanzen oder Objekte erstellt werden.A class or struct declaration is like a blueprint that is used to create instances or objects at run time. Wenn Sie eine Klasse oder eine Struktur mit dem Namen Person definieren, hat der Typ den Namen Person.If you define a class or struct called Person, Person is the name of the type. Wenn Sie eine Variable p vom Typ Person deklarieren und initialisieren, wird p als Objekt oder Instanz von Person bezeichnet.If you declare and initialize a variable p of type Person, p is said to be an object or instance of Person. Vom selben Typ Person können mehrere Instanzen erstellt werden, und jede Instanz kann über unterschiedliche Werte in ihren Eigenschaften und Feldern verfügen.Multiple instances of the same Person type can be created, and each instance can have different values in its properties and fields.

Eine Klasse ist ein Verweistyp.A class is a reference type. Wenn ein Objekt der Klasse erstellt wird, enthält die Variable, der das Objekt zugewiesen wurde, lediglich einen Verweis auf den entsprechenden Speicherort.When an object of the class is created, the variable to which the object is assigned holds only a reference to that memory. Wenn der Objektverweis einer neuen Variablen zugewiesen wird, verweist die neue Variable auf das ursprüngliche Objekt.When the object reference is assigned to a new variable, the new variable refers to the original object. Über eine Variable vorgenommene Änderungen gelten auch für die andere Variable, da beide auf dieselben Daten verweisen.Changes made through one variable are reflected in the other variable because they both refer to the same data.

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.

Im Allgemeinen werden Klassen zum Modellieren von komplexerem Verhalten oder von Daten verwendet, die dafür vorgesehen sind, nach der Erstellung eines Klassenobjekts geändert zu werden.In general, classes are used to model more complex behavior, or data that is intended to be modified after a class object is created. Strukturen sind am besten für kleine Datenstrukturen geeignet, die überwiegend Daten enthalten, deren Änderung nach der Erstellung der Struktur nicht vorgesehen ist.Structs are best suited for small data structures that contain primarily data that is not intended to be modified after the struct is created.

Weitere Informationen finden Sie unter Klassen, Objekte und Strukturen.For more information, see Classes, Objects, and Structs.

BeispielExample

Im folgenden Beispiel CustomClass in ProgrammingGuide weist der Namespace drei Member auf: einen Instanzkonstruktor, eine Eigenschaft mit der Bezeichnung Number und eine Methode mit der Bezeichnung Multiply.In the following example, CustomClass in the ProgrammingGuide namespace has three members: an instance constructor, a property named Number, and a method named Multiply. Die Main-Methode in der Program-Klasse erstellt eine Instanz (Objekt) von CustomClass. Auf die Methoden und Eigenschaften des Objekts wird mit der Punktnotation zugegriffen.The Main method in the Program class creates an instance (object) of CustomClass, and the object’s method and property are accessed by using dot notation.

using System;

namespace ProgrammingGuide
{
   // Class definition.
   public class CustomClass
   {
      // Class members.
      //
      // Property.
      public int Number { get; set; }

      // Method.
      public int Multiply(int num)
      {
          return num * Number;
      }

      // Instance Constructor.
      public CustomClass()
      {
          Number = 0;
      }
   }

   // Another class definition that contains Main, the program entry point.
   class Program
   {
      static void Main(string[] args)
      {
         // Create an object of type CustomClass.
         CustomClass custClass = new CustomClass();

         // Set the value of the public property.
         custClass.Number = 27;

         // Call the public method.
         int result = custClass.Multiply(4);
         Console.WriteLine($"The result is {result}.");
      }
   }
}
// The example displays the following output:
//      The result is 108. 

KapselungEncapsulation

Kapselung wird gelegentlich als erster Pfeiler oder als Prinzip der objektorientierten Programmierung bezeichnet.Encapsulation is sometimes referred to as the first pillar or principle of object-oriented programming. Dem Prinzip der Kapselung zufolge kann eine Klasse oder Struktur festlegen, inwieweit Code außerhalb der Klasse oder Struktur auf deren Member zugreifen kann.According to the principle of encapsulation, a class or struct can specify how accessible each of its members is to code outside of the class or struct. Nicht für die Verwendung von außerhalb der Klasse oder Assembly vorgesehene Methoden und Variablen können versteckt werden, um die Wahrscheinlichkeit von Programmierfehlern und böswilligen Angriffen zu verringern.Methods and variables that are not intended to be used from outside of the class or assembly can be hidden to limit the potential for coding errors or malicious exploits.

Weitere Informationen zu Klassen und Klassenmembern finden Sie unter Klassen und Objekte.For more information about classes, see Classes and Objects.

MitgliederMembers

Alle Methoden, Felder, Konstanten, Eigenschaften und Ereignisse müssen innerhalb eines Typs deklariert werden. Diese Elemente werden als Member des Typs bezeichnet.All methods, fields, constants, properties, and events must be declared within a type; these are called the members of the type. In C# gibt es im Gegensatz zu einigen anderen Sprachen keine globalen Variablen oder Methoden.In C#, there are no global variables or methods as there are in some other languages. Selbst der Einstiegspunkt eines Programms, die Main-Methode, muss innerhalb einer Klasse oder einer Struktur deklariert werden.Even a program's entry point, the Main method, must be declared within a class or struct. In der folgenden Liste werden sämtliche Arten von Membern aufgeführt, die in einer Klasse bzw. einer Struktur deklariert werden können.The following list includes all the various kinds of members that may be declared in a class or struct.

BarrierefreiheitAccessibility

Einige Methoden und Eigenschaften sind für den Aufruf oder Zugriff von als Clientcode bezeichnetem Code außerhalb der Klasse oder Struktur vorgesehen.Some methods and properties are meant to be called or accessed from code outside your class or struct, known as client code. Andere Methoden und Eigenschaften dienen nur der Verwendung in der Klasse oder Struktur selbst.Other methods and properties might be only for use in the class or struct itself. Es ist wichtig, den Zugriff auf den Code einzuschränken, damit nur der Clientcode darauf zugreifen kann, der dafür vorgesehen ist.It is important to limit the accessibility of your code so that only the intended client code can reach it. Inwieweit Clientcode auf die Typen und deren Member zugreifen kann, können Sie mit den Zugriffsmodifizierern public, protected, internal, protected internal, private und private protected festlegen.You specify how accessible your types and their members are to client code by using the access modifiers public, protected, internal, protected internal, private and private protected. Die Standardeinstellung für den Zugriff lautet private.The default accessibility is private. Weitere Informationen finden Sie unter Zugriffsmodifizierer.For more information, see Access Modifiers.

VererbungInheritance

Klassen (jedoch nicht Strukturen) unterstützen das Konzept der Vererbung.Classes (but not structs) support the concept of inheritance. Eine Klasse, die von einer anderen Klasse (der Basisklasse) abgeleitet ist, enthält automatisch alle öffentlichen, geschützten und internen Member der Basisklasse mit Ausnahme der Konstruktoren und Finalizer.A class that derives from another class (the base class) automatically contains all the public, protected, and internal members of the base class except its constructors and finalizers. Weitere Informationen finden Sie unter Vererbung und Polymorphie.For more information, see Inheritance and Polymorphism.

Klassen können als abstrakt deklariert werden. Das bedeutet, dass mindestens eine ihrer Methoden nicht implementiert ist.Classes may be declared as abstract, which means that one or more of their methods have no implementation. Obwohl abstrakte Klassen nicht direkt instanziiert werden können, können Sie als Basisklassen für andere Klassen dienen, von denen die fehlende Implementierung bereitgestellt wird.Although abstract classes cannot be instantiated directly, they can serve as base classes for other classes that provide the missing implementation. Klassen können auch als versiegelt deklariert werden, um zu verhindern, dass andere Klassen von ihnen erben.Classes can also be declared as sealed to prevent other classes from inheriting from them. Weitere Informationen zu abstrakten Klassen finden Sie unter Abstrakte und versiegelte Klassen und Klassenmember.For more information, see Abstract and Sealed Classes and Class Members.

SchnittstellenInterfaces

Klassen und Strukturen können von mehreren Schnittstellen erben.Classes and structs can inherit multiple interfaces. Von einer Schnittstelle erben bedeutet, dass der Typ alle in der Schnittstelle definierten Methoden implementiert.To inherit from an interface means that the type implements all the methods defined in the interface. Weitere Informationen finden Sie unter Schnittstellen.For more information, see Interfaces.

Generische TypenGeneric Types

Klassen und Strukturen können mit einem oder mehreren Typparametern definiert werden.Classes and structs can be defined with one or more type parameters. Der Typ wird beim Erstellen einer Instanz des Typs vom Clientcode bereitgestellt.Client code supplies the type when it creates an instance of the type. Beispielsweise ist die List<T>-Klasse im System.Collections.Generic-Namespace mit einem Typparameter definiert.For example The List<T> class in the System.Collections.Generic namespace is defined with one type parameter. Vom Clientcode wird eine Instanz von List<string> oder List<int> erstellt, um den Typ anzugeben, den die Liste enthalten soll.Client code creates an instance of a List<string> or List<int> to specify the type that the list will hold. Weitere Informationen finden Sie unter Generika.For more information, see Generics.

Statische TypenStatic Types

Klassen (nicht jedoch Strukturen) können als statisch deklariert werden.Classes (but not structs) can be declared as static. Eine statische Klasse kann nur statische Member enthalten und nicht mit dem Schlüsselwort "new" instanziiert werden.A static class can contain only static members and cannot be instantiated with the new keyword. Beim Laden des Programms wird eine Kopie der Klasse in den Speicher geladen. Auf deren Member wird über den Klassennamen zugegriffen.One copy of the class is loaded into memory when the program loads, and its members are accessed through the class name. Sowohl Klassen als auch Strukturen können statische Member enthalten.Both classes and structs can contain static members. Weitere Informationen finden Sie unter Statische Klassen und statische Klassenmember.For more information, see Static Classes and Static Class Members.

Geschachtelte TypenNested Types

Eine Klasse oder Struktur kann innerhalb einer anderen Klasse oder Struktur geschachtelt werden.A class or struct can be nested within another class or struct. Weitere Informationen finden Sie unter Geschachtelte Typen.For more information, see Nested Types.

Partielle TypenPartial Types

Sie können einen Teil einer Klasse, Struktur oder Methode in einer Codedatei und einen anderen Teil in einer separaten Codedatei definieren.You can define part of a class, struct or method in one code file and another part in a separate code file. Weitere Informationen finden Sie unter Partielle Klassen und Methoden.For more information, see Partial Classes and Methods.

ObjektinitialisiererObject Initializers

Klassen- oder Strukturobjekte sowie Auflistungen von Objekten können instanziiert und initialisiert werden, ohne deren Konstruktor explizit aufzurufen.You can instantiate and initialize class or struct objects, and collections of objects, without explicitly calling their constructor. Weitere Informationen finden Sie unter Objekt- und Auflistungsinitialisierer.For more information, see Object and Collection Initializers.

Anonyme TypenAnonymous Types

Anonyme Typen werden in Fällen verwendet, in denen benannte Klassen nicht ohne Weiteres erstellt werden können bzw. nicht benötigt werden, beispielsweise beim Füllen einer Liste mit Datenstrukturen, die nicht erhalten bleiben oder an andere Methoden übergeben werden müssen.In situations where it is not convenient or necessary to create a named class, for example when you are populating a list with data structures that you do not have to persist or pass to another method, you use anonymous types. Weitere Informationen finden Sie unter Anonyme Typen.For more information, see Anonymous Types.

ErweiterungsmethodenExtension Methods

Sie können Klassen "erweitern", ohne eine abgeleitete Klasse zu erstellen, indem Sie einen separaten Typ erstellen, dessen Methoden aufgerufen werden können, als würden sie zum ursprünglichen Typ gehören.You can "extend" a class without creating a derived class by creating a separate type whose methods can be called as if they belonged to the original type. Weitere Informationen finden Sie unter Erweiterungsmethoden.For more information, see Extension Methods.

Implizit typisierte lokale VariablenImplicitly Typed Local Variables

Innerhalb einer Klassen- oder Strukturmethode können Sie implizite Typisierung verwenden, um den Compiler anzuweisen, bei der Kompilierung den richtigen Typ zu bestimmen.Within a class or struct method, you can use implicit typing to instruct the compiler to determine the correct type at compile time. Weitere Informationen finden Sie unter Implizit typisierte lokale Variablen.For more information, see Implicitly Typed Local Variables.

C#-ProgrammiersprachenspezifikationC# Language Specification

Weitere Informationen erhalten Sie unter C#-Sprachspezifikation. Die Sprachspezifikation ist die verbindliche Quelle für die Syntax und Verwendung von C#.

Siehe auchSee Also

C#-ProgrammierhandbuchC# Programming Guide