Freigeben über


Felder (C#-Programmierhandbuch)

Aktualisiert: August 2010

Ein Feld ist eine Variable eines beliebigen Typs, die direkt in einer Klasse oder Struktur deklariert wird. Felder sind Member des Typs, der sie enthält.

Eine Klasse oder Struktur kann über Instanzfelder, statische Felder oder beides verfügen. Instanzfelder sind für eine Instanz eines Typs spezifisch. Wenn Sie eine Klasse "T" mit dem Instanzfeld "F" haben, können Sie zwei Objekte vom Typ "T" erstellen und den Wert von "F" in beiden Objekten ändern, ohne dabei den Wert im jeweils anderen Objekt zu ändern. Im Gegensatz dazu gehört ein statisches Feld zur Klasse selbst und wird in allen Instanzen dieser Klasse bereitgestellt. Durch die Instanz "A" vorgenommene Änderungen sind für die Instanzen "B" und "C" sofort sichtbar, wenn diese auf das Feld zugreifen.

Im Allgemeinen sollten Felder nur für Variablen verwendet werden, auf die privat oder geschützt zugegriffen werden kann. Daten, die dem Clientcode von der Klasse verfügbar gemacht werden, sollten durch Methoden, Eigenschaften und Indexer bereitgestellt werden. Mit diesen Konstrukten für indirekten Zugriff auf interne Felder können ungültige Eingabewerte verhindert werden. Ein privates Feld, das über eine öffentliche Eigenschaft bereitgestellte Daten speichert, wird als Sicherungsspeicher oder dahinter liegendes Feld bezeichnet.

Felder speichern meist Daten, auf die von mehr als einer Klassenmethode zugegriffen werden muss und die über die Lebensdauer einer einzelnen Methode hinaus gespeichert werden müssen. So könnte eine Klasse, die ein Kalenderdatum darstellt, drei Felder mit ganzzahligen Werten beinhalten, jeweils für den Tag, den Monat und das Jahr. Variablen, die außerhalb des Bereichs einer einzelnen Methode nicht verwendet werden, sollten als lokale Variablen im Methodentext selbst deklariert werden.

Felder werden im Klassenblock definiert, indem die Zugriffsstufe des Felds, gefolgt vom Typ und dem Namen des Felds, angegeben wird. Beispiele:

public class CalendarEntry
{
    // private field
    private DateTime date;

    // public field (Generally not recommended.)
    public string day;

    // Public property exposes date field safely.
    public DateTime Date 
    {
        get 
        {
            return date;
        }
        set 
        {
            // Set some reasonable boundaries for likely birth dates.
            if (value.Year > 1900 && value.Year <= DateTime.Today.Year)
            {
                date = value;
            }
            else
                throw new ArgumentOutOfRangeException();
        }

    }

    // Public method also exposes date field safely.
    // Example call: birthday.SetDate("1975, 6, 30");
    public void SetDate(string dateString)
    {
        DateTime dt = Convert.ToDateTime(dateString);

        // Set some reasonable boundaries for likely birth dates.
        if (dt.Year > 1900 && dt.Year <= DateTime.Today.Year)
        {
            date = dt;
        }
        else
            throw new ArgumentOutOfRangeException();
    }

    public TimeSpan GetTimeSpan(string dateString)
    {
        DateTime dt = Convert.ToDateTime(dateString);

        if (dt != null && dt.Ticks < date.Ticks)
        {
            return date - dt;
        }
        else
            throw new ArgumentOutOfRangeException();  

    }
}

Um auf ein Feld in einem Objekt zuzugreifen, fügen Sie einen Punkt und den Feldnamen hinter dem Objektnamen hinzu, wie in objectname.fieldname. Beispiele:

CalendarEntry birthday = new CalendarEntry();
birthday.day = "Saturday";

Bei der Deklaration eines Felds kann diesem mithilfe des Zuweisungsoperators ein Anfangswert zugewiesen werden. Um dem day-Feld zum Beispiel automatisch den Wert "Monday" zuzuweisen, deklarieren Sie day wie im folgenden Beispiel:

public class CalendarDateWithInitialization
{
    public string day = "Monday";
    //...
}

Felder werden sofort initialisiert, bevor der Konstruktor für die Objektinstanz aufgerufen wird. Wenn der Konstruktor den Wert eines Felds zuweist, überschreibt er alle während der Felddeklaration angegebenen Werte. Weitere Informationen finden Sie unter Verwenden von Konstruktoren (C#-Programmierhandbuch).

Tipp

Ein Feldinitialisierer kann nicht auf andere Instanzfelder verweisen.

Felder können als public, private, protected, internal oder protected internal gekennzeichnet werden. Diese Zugriffsmodifizierer definieren, wie Benutzer der Klasse auf die Felder zugreifen können. Weitere Informationen finden Sie unter Zugriffsmodifizierer (C#-Programmierhandbuch).

Ein Feld kann optional als static deklariert werden. Dadurch ist das Feld jederzeit für die Aufrufer verfügbar, selbst wenn keine Instanz der Klasse vorhanden ist. Weitere Informationen finden Sie unter Statische Klassen und statische Klassenmember (C#-Programmierhandbuch).

Ein Feld kann als readonly deklariert werden. Einem schreibgeschützten Feld kann lediglich bei der Initialisierung oder in einem Konstruktor ein Wert zugewiesen werden. Ein static readonly-Feld ähnelt einer Konstante. Der einzige Unterschied besteht darin, dass der C#-Compiler während der Kompilierung keinen Zugriff auf den Wert hat, der in einem statischen schreibgeschützten Feld enthalten ist. Der Zugriff auf diesen Wert ist lediglich zur Laufzeit möglich. Weitere Informationen finden Sie unter Konstanten (C#-Programmierhandbuch).

C#-Programmiersprachenspezifikation

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

Siehe auch

Referenz

Klassen und Strukturen (C#-Programmierhandbuch)

Verwenden von Konstruktoren (C#-Programmierhandbuch)

Vererbung (C#-Programmierhandbuch)

Zugriffsmodifizierer (C#-Programmierhandbuch)

Abstrakte und versiegelte Klassen und Klassenmember (C#-Programmierhandbuch)

Konzepte

C#-Programmierhandbuch

Änderungsprotokoll

Datum

Versionsgeschichte

Grund

August 2010

Die Bedingungen in den if-Anweisungen im Beispiel wurden korrigiert.

Kundenfeedback.