Felder (C#-Programmierhandbuch)

Ein Feld ist eine Variable eines beliebigen Typs, die direkt in einer class oder struct deklariert ist. Felder sind Member Ihres enthaltenden Typs.

Eine Klasse oder Struktur kann über Instanzfelder, statische Felder oder beides verfügen. Instanzenfelder sind für eine Instanz eines Typs spezifisch. Wenn Sie eine Klasse T mit einem Instanzenfeld F haben, können Sie zwei Objekte vom Typ T erstellen und den Wert von F in jedem Objekt ändern, ohne dabei den Wert in dem anderen Objekt zu beeinflussen. Im Gegensatz dazu gehört ein statisches Feld zum Typ selbst und wird in allen Instanzen dieses Typs gemeinsam verwendet. Sie können nur auf das statische Feld zugreifen, indem Sie den Typnamen verwenden. Wenn Sie über einen Instanznamen auf das statische Feld zugreifen, erhalten Sie den Kompilierzeitfehler CS0176.

Im Allgemeinen sollten Sie private- oder protected-Barrierefreiheit für Felder deklarieren. Daten, die Ihr Typ für Clientcode bereitstellt, sollten über Methoden, Eigenschaften und Indexer bereitgestellt werden. Sie können sich mit diesen Konstrukten für indirekten Zugriff auf interne Felder vor ungültigen Eingabewerten schützen. Ein privates Feld, das über eine öffentliche Eigenschaft bereitgestellte Daten speichert, wird als Sicherungsspeicher oder Unterstützungsfeld bezeichnet. Sie können public-Felder deklarieren, aber sie können dann nicht verhindern, dass Code, der Ihren Typ verwendet, dieses Feld auf einen ungültigen Wert festlegt oder die Daten eines Objekts anderweitig ändert.

Felder speichern in der Regel die Daten, die über Zugriff auf mehrere Typmethodem verfügen müssen und länger als die Lebensdauer einer einzelnen Methode gespeichert werden müssen. Beispielsweise verfügt ein Typ, der ein Kalenderdatum darstellt, möglicherweise über drei Felder: Jeweils eines für Monat, Tag und Jahr. Variablen, die außerhalb des Bereichs einer einzelnen Methode nicht verwendet werden, sollten als lokale Variablen innerhalb des Methodentexts selbst deklariert werden.

Felder werden innerhalb der Klasse oder des Strukturblocks deklariert, indem Sie die Zugriffsebene des Felds, gefolgt vom Typ und Namen des Felds angeben. Beispiel:

public class CalendarEntry
{

    // private field (Located near wrapping "Date" property).
    private DateTime _date;

    // 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("Date");
            }
        }
    }

    // public field (Generally not recommended).
    public string? Day;

    // 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("dateString");
        }
    }

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

        if (dt.Ticks < _date.Ticks)
        {
            return _date - dt;
        }
        else
        {
            throw new ArgumentOutOfRangeException("dateString");
        }
    }
}

Um auf ein Feld in einer Instanz zuzugreifen, fügen Sie einen Punkt hinter dem Instanznamen ein, gefolgt vom Namen des Felds, wie in instancename._fieldName. Zum Beispiel:

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

Einem Feld kann ein Anfangswert durch Verwendung des Zuweisungsoperators zugewiesen werden, wenn das Feld deklariert wird. Sie würden z.B. Day wie im folgenden Beispiel deklarieren, um das Day-Feld automatisch "Monday" zuzuweisen:

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

Felder werden umgehend initialisiert, bevor der Konstruktor für die Objektinstanz aufgerufen wird. Wenn der Konstruktor den Wert eines Felds zuweist, überschreibt er jeden während der Felddeklaration angegebenen Wert. Weitere Informationen finden Sie unter Verwenden von Konstruktoren.

Hinweis

Ein Feldinitialisierer kann nicht auf andere Instanzfelder verweisen.

Felder können als public, private, protected, internal, protected internal oder private protected gekennzeichnet werden. Diese Zugriffsmodifizierer definieren, wie Benutzer des Typs auf die Felder zugreifen können. Weitere Informationen finden Sie unter Zugriffsmodifizierer.

Ein Feld kann optional als static deklariert werden. Statische Felder stehen Aufrufern jederzeit zur Verfügung, auch wenn keine Instanz des Typs vorhanden ist. Weitere Informationen finden Sie unter Statische Klassen und statische Klassenmember.

Ein Feld kann als readonly deklariert werden. Einem schreibgeschützten Feld kann nur ein Wert während der Initialisierung oder in einem Konstruktor zugewiesen werden. Ein static readonly-Feld einer Konstanten ähnlich, außer dass der C#-Compiler nicht auf den Wert eines statischen schreibgeschützten Felds zur Kompilierzeit, sondern nur zur Laufzeit zugreifen kann. Weitere Informationen finden Sie unter Konstanten.

Ein Feld kann als required deklariert werden. Ein erforderliches Feld muss vom Konstruktor oder von einem Objektinitialisierer initialisiert werden, wenn ein Objekt erstellt wird. Sie fügen das System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute-Attribut zu einer Konstruktordeklaration hinzu, die alle erforderlichen Member initialisiert.

Der required-Modifizierer kann nicht mit dem readonly-Modifizierer im selben Feld kombiniert werden. Eigenschaft kann jedoch nur required und init sein.

Ab C# 12 sind Parameter primärer Konstruktoren eine Alternative zum Deklarieren von Feldern. Wenn Ihr Typ über Abhängigkeiten verfügt, die bei der Initialisierung bereitgestellt werden müssen, können Sie einen primären Konstruktor erstellen, der diese Abhängigkeiten bereitstellt. Diese Parameter können erfasst und anstelle von deklarierten Feldern in Ihren Typen verwendet werden. Bei record-Typen werden Parameter primärer Konstruktoren als öffentliche Eigenschaften bereitgestellt.

C#-Sprachspezifikation

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

Weitere Informationen