Objektorientiertes Programmieren (C#)Object-Oriented Programming (C#)

C# bietet vollständige Unterstützung für objektorientierte Programmierung, einschließlich Kapselung, Vererbung und Polymorphie.C# provides full support for object-oriented programming including encapsulation, inheritance, and polymorphism.

Kapselung bedeutet, dass eine Gruppe verwandter Eigenschaften, Methoden sowie anderer Member als eine Einheit bzw. ein Objekt behandelt wird.Encapsulation means that a group of related properties, methods, and other members are treated as a single unit or object.

Vererbung beschreibt die Fähigkeit, neue Klassen basierend auf einer vorhandenen Klasse zu erstellen.Inheritance describes the ability to create new classes based on an existing class.

Polymorphismus bedeutet, dass Sie mehrere Klassen untereinander austauschen können, obwohl jede Klasse dieselben Eigenschaften oder Methoden auf unterschiedliche Art und Weise implementiert.Polymorphism means that you can have multiple classes that can be used interchangeably, even though each class implements the same properties or methods in different ways.

In diesem Abschnitt werden die folgenden Konzepte beschrieben:This section describes the following concepts:

Klassen und ObjekteClasses and Objects

Die Begriffe Klasse und Objekt werden manchmal synonym verwendet; genau genommen beschreiben Klassen jedoch den Typ von Objekten, während Objekte verwendbare Instanzen von Klassen sind.The terms class and object are sometimes used interchangeably, but in fact, classes describe the type of objects, while objects are usable instances of classes. Das Erstellen eines Objekts wird daher als Instanziierung bezeichnet.So, the act of creating an object is called instantiation. Um auf den Vergleich mit Bauplänen zurückzukommen: Eine Klasse ist ein Bauplan, und ein Objekt ist ein anhand dieses Bauplans errichtetes Gebäude.Using the blueprint analogy, a class is a blueprint, and an object is a building made from that blueprint.

So definieren Sie eine KlasseTo define a class:

class SampleClass  
{  
}  

Auch C# stellt vereinfachte Versionen von Klassen bereit, die als Strukturen bezeichnet werden. Strukturen sind hilfreich, wenn Sie ein großes Objektarray erstellen müssen und nicht zu viel Arbeitsspeicher belegen wollen.C# also provides a light version of classes called structures that are useful when you need to create large array of objects and do not want to consume too much memory for that.

So definieren Sie eine StrukturTo define a structure:

struct SampleStruct  
{  
}  

Weitere Informationen finden Sie unter:For more information, see:

KlassenmemberClass Members

Jede Klasse kann über andere Klassenmember verfügen. Diese enthalten Eigenschaften, die Klassendaten beschreiben, Methoden, die Klassenverhalten definieren sowie Ereignisse, die die Kommunikation zwischen verschiedenen Klassen und Objekten bereitstellen.Each class can have different class members that include properties that describe class data, methods that define class behavior, and events that provide communication between different classes and objects.

Eigenschaften und FelderProperties and Fields

Felder und Eigenschaften stellen die in einem Objekt enthaltenen Informationen dar.Fields and properties represent information that an object contains. Felder sind wie Variablen, sie können direkt gelesen oder festgelegt werden.Fields are like variables because they can be read or set directly.

So definieren Sie ein FeldTo define a field:

Class SampleClass  
{  
    public string sampleField;  
}  

Eigenschaften verfügen über Get- und Set-Prozeduren, die eine bessere Kontrolle über das Festlegen oder Abrufen von Werten ermöglichen.Properties have get and set procedures, which provide more control on how values are set or returned.

Mit C# können Sie ein privates Feld erstellen, um den Eigenschaftswert zu speichern, oder Sie können automatisch implementierte Eigenschaften verwenden, die dieses Feld automatisch im Hintergrund erstellen und die grundlegende Logik für die Eigenschaftenprozeduren bereitstellen.C# allows you either to create a private field for storing the property value or use so-called auto-implemented properties that create this field automatically behind the scenes and provide the basic logic for the property procedures.

So definieren Sie eine automatisch implementierte EigenschaftTo define an auto-implemented property:

class SampleClass  
{  
    public int SampleProperty { get; set; }  
}  

Verwenden Sie den folgenden Code, wenn Sie zusätzliche Lese- und Schreibvorgänge für den Eigenschaftswert ausführen müssen, um ein Feld zum Speichern des Eigenschaftswerts zu definieren und die grundlegende Logik zum Speichern und Abrufen bereitzustellen:If you need to perform some additional operations for reading and writing the property value, define a field for storing the property value and provide the basic logic for storing and retrieving it:

class SampleClass  
{  
    private int _sample;  
    public int Sample  
    {  
        // Return the value stored in a field.  
        get { return _sample; }  
        // Store the value in the field.  
        set { _sample = value; }  
    }  
}  

Die meisten Eigenschaften verfügen über Methoden oder Prozeduren zum Festlegen und Abrufen des Eigenschaftswerts.Most properties have methods or procedures to both set and get the property value. Sie können jedoch schreib- oder lesegeschützte Eigenschaften erstellen, um zu verhindern, dass die Eigenschaften gelesen oder geändert werden.However, you can create read-only or write-only properties to restrict them from being modified or read. In C# muss die get-Eigenschaftenmethode oder die set-Eigenschaftenmethode nicht angegeben werden.In C#, you can omit the get or set property method. Automatisch implementierte Eigenschaften können jedoch nicht schreib- oder lesegeschützt sein.However, auto-implemented properties cannot be read-only or write-only.

Weitere Informationen finden Sie unter:For more information, see:

MethodenMethods

Eine Methode ist eine Aktion, die von einem Objekt ausgeführt werden kann.A method is an action that an object can perform.

So definieren Sie eine Methode einer Klasse:To define a method of a class:

class SampleClass  
{  
    public int sampleMethod(string sampleParam)  
    {  
        // Insert code here  
    }  
}  

Eine Klasse kann über mehrere Implementierungen oder Überladungen der gleichen Methode verfügen, die sich in der Anzahl der Parameter oder Parametertypen unterscheiden.A class can have several implementations, or overloads, of the same method that differ in the number of parameters or parameter types.

So überladen Sie eine MethodeTo overload a method:

public int sampleMethod(string sampleParam) {};  
public int sampleMethod(int sampleParam) {}  

In den meisten Fällen deklarieren Sie eine Methode innerhalb einer Klassendefinition.In most cases you declare a method within a class definition. Auch C# unterstützt jedoch Erweiterungsmethoden, mit denen Sie einer vorhandenen Klasse außerhalb der eigentlichen Klassendefinition Methoden hinzuzufügen können.However, C# also supports extension methods that allow you to add methods to an existing class outside the actual definition of the class.

Weitere Informationen finden Sie unter:For more information, see:

KonstruktorenConstructors

Konstruktoren sind Klassenmethoden, die automatisch ausgeführt werden, wenn ein Objekt eines bestimmten Typs erstellt wird.Constructors are class methods that are executed automatically when an object of a given type is created. Konstruktoren initialisieren normalerweise die Datenmember des neuen Objekts.Constructors usually initialize the data members of the new object. Konstruktoren können nur einmal während der Erstellung der Klasse ausgeführt werden.A constructor can run only once when a class is created. Weiterhin wird der Code im Konstruktor immer vor jedem anderen Code in einer Klasse ausgeführt.Furthermore, the code in the constructor always runs before any other code in a class. Sie können jedoch mehrere Konstruktorüberladungen auf die gleiche Weise wie für jede andere Methode erstellen.However, you can create multiple constructor overloads in the same way as for any other method.

So definieren Sie einen Konstruktor für eine Klasse:To define a constructor for a class:

public class SampleClass  
{  
    public SampleClass()  
    {  
        // Add code here  
    }  
}  

Weitere Informationen finden Sie unter:For more information, see:

Konstruktoren.Constructors.

FinalizerFinalizers

Finalizer werden zur Zerstörung von Klasseninstanzen verwendet.Finalizers are used to destruct instances of classes. In .NET Framework verwaltet die Garbage Collection die Speicherbelegung automatisch und gibt Arbeitsspeicher für die verwalteten Objekte in der Anwendung frei.In the .NET Framework, the garbage collector automatically manages the allocation and release of memory for the managed objects in your application. Möglicherweise sind jedoch noch Finalizer erforderlich, um alle nicht verwalteten Ressourcen zu bereinigen, die von der Anwendung erstellt werden.However, you may still need finalizers to clean up any unmanaged resources that your application creates. Es kann nur einen Finalizer für eine Klasse geben.There can be only one finalizers for a class.

Weitere Informationen zu Finalizern und der Garbage Collection in .NET Framework finden Sie unter Garbage Collection.For more information about finalizers and garbage collection in the .NET Framework, see Garbage Collection.

EreignisseEvents

Ereignisse aktivieren eine Klasse oder ein Objekt, um Informationen über Aktionen von Interesse an andere Klassen oder Objekte zu übermitteln.Events enable a class or object to notify other classes or objects when something of interest occurs. Die Klasse, die das Ereignis sendet (oder auslöst), wird als Herausgeber bezeichnet, und die Klassen, die das Ereignis empfangen (oder verarbeiten), werden als Abonnenten bezeichnet.The class that sends (or raises) the event is called the publisher and the classes that receive (or handle) the event are called subscribers. Weitere Informationen zu Ereignissen sowie zu ihrer Auslösung und Behandlung finden Sie unter Ereignisse.For more information about events, how they are raised and handled, see Events.

  • Verwenden Sie das Schlüsselwort event, um ein Ereignis in einer Klasse zu deklarieren.To declare an event in a class, use the event keyword.

  • Um ein Ereignis auszulösen, rufen Sie den Ereignisdelegaten auf.To raise an event, invoke the event delegate.

  • Verwenden Sie den +=-Operator, um ein Ereignis zu abonnieren, und verwenden Sie den -=-Operator, um das Abonnement eines Ereignisses zu kündigen.To subscribe to an event, use the += operator; to unsubscribe from an event, use the -= operator.

Geschachtelte KlassenNested Classes

Eine Klasse, die in einer anderen Klasse definiert wird, wird als geschachtelt bezeichnet.A class defined within another class is called nested. Standardmäßig ist die geschachtelte Klasse privat.By default, the nested class is private.

class Container  
{  
    class Nested  
    {  
        // Add code here.  
    }  
}  

Um eine Instanz der geschachtelten Klasse zu erstellen, verwenden Sie den Namen der Containerklasse und geben einen Punkt sowie anschließend den Namen der geschachtelten Klasse ein:To create an instance of the nested class, use the name of the container class followed by the dot and then followed by the name of the nested class:

Container.Nested nestedInstance = new Container.Nested()  

Zugriffsmodifizierer und ZugriffsebenenAccess Modifiers and Access Levels

Alle Klassen und Klassenmember können mit Zugriffsmodifizierern angeben, welche Zugriffsebene sie für andere Klassen bereitstellen.All classes and class members can specify what access level they provide to other classes by using access modifiers.

Die folgenden Zugriffsmodifizierer sind verfügbar:The following access modifiers are available:

C#-ModifiziererC# Modifier DefinitionDefinition
publicpublic Auf den Typ oder Member kann von jedem Code in der gleichen Assembly oder einer anderen Assembly, die darauf verweist, zugegriffen werden.The type or member can be accessed by any other code in the same assembly or another assembly that references it.
privateprivate Auf den Typ oder Member kann nur von Code in der gleichen Klasse zugegriffen werden.The type or member can only be accessed by code in the same class.
protectedprotected Auf den Typ oder Member kann nur von Code in der gleichen Klasse oder in einer abgeleiteten Klasse zugegriffen werden.The type or member can only be accessed by code in the same class or in a derived class.
internalinternal Auf den Typ oder Member kann von jedem Code in der gleichen Assembly zugegriffen werden, jedoch nicht von Code in einer anderen Assembly.The type or member can be accessed by any code in the same assembly, but not from another assembly.
interne geschütztprotected internal Auf den Typ oder Member kann von jedem Code in der gleichen Assembly oder von jeder abgeleiteten Klasse in einer anderen Assembly zugegriffen werden.The type or member can be accessed by any code in the same assembly, or by any derived class in another assembly.
geschützt privatprivate protected Der Typ oder Member kann von Code in der gleichen Klasse oder in einer abgeleiteten Klasse innerhalb der Assembly Basisklasse zugegriffen werden.The type or member can be accessed by code in the same class or in a derived class within the base class assembly.

Weitere Informationen finden Sie unter Zugriffsmodifizierer.For more information, see Access Modifiers.

Instanziieren von KlassenInstantiating Classes

Um ein Objekt zu erstellen, müssen Sie eine Klasse instanziieren oder eine Klasseninstanz erstellen.To create an object, you need to instantiate a class, or create a class instance.

SampleClass sampleObject = new SampleClass();  

Nachdem Sie eine Klasse instanziiert haben, können Sie den Eigenschaften und Feldern der Instanz Werte zuweisen und Klassenmethoden aufrufen.After instantiating a class, you can assign values to the instance's properties and fields and invoke class methods.

// Set a property value.  
sampleObject.sampleProperty = "Sample String";  
// Call a method.  
sampleObject.sampleMethod();  

Verwenden Sie Objektinitialisierer, um Eigenschaften im Rahmen des Klasseninstanziierungsprozesses Werte zuzuweisen:To assign values to properties during the class instantiation process, use object initializers:

// Set a property value.  
SampleClass sampleObject = new SampleClass   
    { FirstProperty = "A", SecondProperty = "B" };  

Weitere Informationen finden Sie unter:For more information, see:

Statische Klassen und MemberStatic Classes and Members

Ein statischer Member der Klasse ist eine Eigenschaft, eine Prozedur oder ein Feld, die von allen Instanzen einer Klasse gemeinsam verwendet werden.A static member of the class is a property, procedure, or field that is shared by all instances of a class.

So definieren Sie einen statischen Member:To define a static member:

static class SampleClass  
{  
    public static string SampleString = "Sample String";  
}  

Verwenden Sie den Namen der Klasse, ohne ein Objekt dieser Klasse zu erstellen, um auf den statischen Member zuzugreifen:To access the static member, use the name of the class without creating an object of this class:

Console.WriteLine(SampleClass.SampleString);  

Statische Klassen in C# haben nur statische Member und können nicht instanziiert werden.Static classes in C# have static members only and cannot be instantiated. Statische Member können auch nicht auf nicht statische Eigenschaften, Felder oder Methoden zugreifen.Static members also cannot access non-static properties, fields or methods

Weitere Informationen finden Sie unter static.For more information, see: static.

Anonyme TypenAnonymous Types

Mit anonymen Typen können Objekte erstellt werden, ohne eine Klassendefinition für den Datentyp zu schreiben.Anonymous types enable you to create objects without writing a class definition for the data type. Stattdessen erzeugt der Compiler eine Klasse.Instead, the compiler generates a class for you. Die Klasse hat keinen verwendbaren Namen und enthält die von Ihnen in der Deklaration des Objekts angegebenen Eigenschaften.The class has no usable name and contains the properties you specify in declaring the object.

So erstellen Sie eine Instanz eines anonymen TypsTo create an instance of an anonymous type:

// sampleObject is an instance of a simple anonymous type.  
var sampleObject =   
    new { FirstProperty = "A", SecondProperty = "B" };  

Weitere Informationen finden Sie unter Anonyme Typen.For more information, see: Anonymous Types.

VererbungInheritance

Vererbung ermöglicht die Erstellung neuer Klassen, die in anderen Klassen definiertes Verhalten wieder verwenden, erweitern und ändern.Inheritance enables you to create a new class that reuses, extends, and modifies the behavior that is defined in another class. Die Klasse, deren Member vererbt werden, wird Basisklasse genannt, und die Klasse, die diese Member erbt, wird abgeleitete Klasse genannt.The class whose members are inherited is called the base class, and the class that inherits those members is called the derived class. Alle Klassen in C# erben jedoch implizit von der Klasse Object, die die .NET-Klassenhierarchie unterstützt und einfache Dienste für alle Klassen bereitstellt.However, all classes in C# implicitly inherit from the Object class that supports .NET class hierarchy and provides low-level services to all classes.

Hinweis

C# unterstützt keine mehrfache Vererbung.C# doesn't support multiple inheritance. Sie können also nur eine Basisklasse für eine abgeleitete Klasse angeben.That is, you can specify only one base class for a derived class.

So erben Sie von einer BasisklasseTo inherit from a base class:

class DerivedClass:BaseClass{}  

Standardmäßig können alle Klassen geerbt werden.By default all classes can be inherited. Sie können jedoch angeben, dass eine Klasse nicht als Basisklasse verwendet werden darf, oder eine Klasse erstellen, die nur als Basisklasse verwendet werden kann.However, you can specify whether a class must not be used as a base class, or create a class that can be used as a base class only.

So geben Sie an, dass eine Klasse nicht als Basisklasse verwendet werden kannTo specify that a class cannot be used as a base class:

public sealed class A { }  

So geben Sie an, dass eine Klasse nur als Basisklasse verwendet und nicht instanziiert werden kann:To specify that a class can be used as a base class only and cannot be instantiated:

public abstract class B { }  

Weitere Informationen finden Sie unter:For more information, see:

Überschreiben von MembernOverriding Members

Standardmäßig erbt eine abgeleitete Klasse alle Member von ihrer Basisklasse.By default, a derived class inherits all members from its base class. Wenn Sie das Verhalten des geerbten Members ändern möchten, müssen Sie diesen überschreiben.If you want to change the behavior of the inherited member, you need to override it. Das heißt, Sie können eine neue Implementierung der Methode, der Eigenschaft oder des Ereignisses in der abgeleiteten Klasse definieren.That is, you can define a new implementation of the method, property or event in the derived class.

Mit folgenden Modifizierern steuern Sie das Überschreiben von Eigenschaften und Methoden:The following modifiers are used to control how properties and methods are overridden:

C#-ModifiziererC# Modifier DefinitionDefinition
virtualvirtual Ermöglicht das Überschreiben eines Klassenmembers in einer abgeleiteten Klasse.Allows a class member to be overridden in a derived class.
overrideoverride Überschreibt einen virtuellen (überschreibbaren) Member, der in der Basisklasse definiert wurde.Overrides a virtual (overridable) member defined in the base class.
abstractabstract Erfordert das Überschreiben eines Klassenmembers in der abgeleiteten Klasse.Requires that a class member to be overridden in the derived class.
new-Modifizierernew Modifier Blendet einen von einer Basisklasse geerbten Member aus.Hides a member inherited from a base class

SchnittstellenInterfaces

Schnittstellen definieren (wie Klassen) einen Satz von Eigenschaften, Methoden und Ereignissen.Interfaces, like classes, define a set of properties, methods, and events. Im Gegensatz zu Klassen jedoch bieten Schnittstellen keine Implementierung.But unlike classes, interfaces do not provide implementation. Sie werden durch Klassen implementiert und als von Klassen unabhängige Entitäten definiert.They are implemented by classes, and defined as separate entities from classes. Eine Schnittstelle stellt insofern einen Vertrag dar, dass eine Klasse, die eine Schnittstelle implementiert, jeden Aspekt dieser Schnittstelle gemäß seiner Definition implementieren muss.An interface represents a contract, in that a class that implements an interface must implement every aspect of that interface exactly as it is defined.

So definieren Sie eine SchnittstelleTo define an interface:

interface ISampleInterface  
{  
    void doSomething();  
}  

So implementieren Sie eine Schnittstelle in einer KlasseTo implement an interface in a class:

class SampleClass : ISampleInterface  
{  
    void ISampleInterface.doSomething()  
    {  
        // Method implementation.  
    }  
}  

Weitere Informationen finden Sie unter:For more information, see:

SchnittstellenInterfaces

interfaceinterface

GenerikaGenerics

Klassen, Strukturen, Schnittstellen und Methoden in .NET Framework können Typparameter enthalten, die Objekttypen definieren, die sie speichern oder verwenden können.Classes, structures, interfaces and methods in the .NET Framework can include type parameters that define types of objects that they can store or use. Das einfachste Beispiel für Generika ist eine Auflistung, in der Sie den Typ von Objekten angeben können, die in einer Auflistung gespeichert werden sollen.The most common example of generics is a collection, where you can specify the type of objects to be stored in a collection.

So definieren Sie eine generische KlasseTo define a generic class:

Public class SampleGeneric<T>   
{  
    public T Field;  
}  

So erstellen Sie eine Instanz einer generischen KlasseTo create an instance of a generic class:

SampleGeneric<string> sampleObject = new SampleGeneric<string>();  
sampleObject.Field = "Sample string";  

Weitere Informationen finden Sie unter:For more information, see:

DelegatenDelegates

Ein Delegat ist ein Typ, der eine Methodensignatur definiert. Er kann einen Verweis auf jede Methode bereitstellen, die über eine kompatible Signatur verfügt.A delegate is a type that defines a method signature, and can provide a reference to any method with a compatible signature. Sie können die Methode über den Delegaten aufrufen.You can invoke (or call) the method through the delegate. Delegaten werden verwendet, um Methoden als Argumente an anderen Methoden zu übergeben.Delegates are used to pass methods as arguments to other methods.

Hinweis

Ereignishandler sind nichts weiter als Methoden, die durch Delegaten aufgerufen werden.Event handlers are nothing more than methods that are invoked through delegates. Weitere Informationen zur Ereignisbehandlung mit Delegaten finden Sie unter Ereignisse.For more information about using delegates in event handling, see Events.

So erstellen Sie einen DelegatenTo create a delegate:

public delegate void SampleDelegate(string str);  

So erstellen Sie einen Verweis auf eine Methode, die der vom Delegaten angegebenen Signatur entspricht:To create a reference to a method that matches the signature specified by the delegate:

class SampleClass  
{  
    // Method that matches the SampleDelegate signature.  
    public static void sampleMethod(string message)  
    {  
        // Add code here.  
    }  
    // Method that instantiates the delegate.  
    void SampleDelegate()  
    {  
        SampleDelegate sd = sampleMethod;  
        sd("Sample string");  
    }  
}  

Weitere Informationen finden Sie unter:For more information, see:

Siehe auchSee Also

C#-ProgrammierhandbuchC# Programming Guide