Freigeben über


Fields (C#-Programmierhandbuch)

Ein Feld ist eine Variable eines beliebigen Typs, der direkt in einer Klasse oder Struktur deklariert wird. Felder sind Elemente ihres enthaltenden Typs.

Eine Klasse oder Struktur kann Instanzfelder, statische Felder oder beides enthalten. Instanzfelder sind spezifisch für eine Instanz eines Typs. Wenn Sie eine Klasse Tmit einem Instanzfeld Fhaben, können Sie zwei Objekte vom Typ Terstellen und den Wert in F jedem Objekt ändern, ohne den Wert im anderen Objekt zu beeinträchtigen. Im Gegensatz dazu gehört ein statisches Feld zum Typ selbst und wird von allen Instanzen dieses Typs gemeinsam verwendet. Sie können nur mithilfe des Typnamens auf das statische Feld zugreifen. Wenn Sie auf das statische Feld anhand eines Instanznamens zugreifen, erhalten Sie CS0176-Kompilierungszeitfehler .

Im Allgemeinen sollten Sie Felder deklarieren private oder protected Barrierefreiheit festlegen. Daten, die Vom Typ für Clientcode verfügbar gemacht werden, sollten über Methoden, Eigenschaften und Indexer bereitgestellt werden. Mithilfe dieser Konstrukte für den indirekten Zugriff auf interne Felder können Sie vor ungültigen Eingabewerten schützen. Ein privates Feld, das die von einer öffentlichen Eigenschaft verfügbar gemachten Daten speichert, wird als Sicherungsspeicher oder Sicherungsfeld bezeichnet. Sie können Felder deklarieren public , aber dann können Sie nicht verhindern, dass Code, der ihren Typ verwendet, das Feld auf einen ungültigen Wert festlegt oder die Daten eines Objekts anderweitig ändert.

Felder speichern in der Regel die Daten, auf die über mehrere Typenmethoden zugegriffen werden muss, und müssen länger als die Lebensdauer einer einzelnen Methode gespeichert werden. Ein Typ, der ein Kalenderdatum darstellt, kann z. B. drei ganzzahlige Felder aufweisen: einen für den Monat, einen für den Tag und eins für das Jahr. Variablen, die nicht außerhalb des Bereichs einer einzelnen Methode verwendet werden, sollten als lokale Variablen im Methodentext selbst deklariert werden.

Felder werden im Klassen- oder Strukturblock deklariert, indem sie die Zugriffsebene gefolgt vom Typ und dem 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 nach dem Namen der Instanz, gefolgt vom Namen des Felds, wie in .instancename._fieldName Beispiel:

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

Ein Feld kann mithilfe des Zuordnungsoperators einen Anfangswert erhalten, wenn das Feld deklariert wird. Um das Day Feld automatisch zuzuweisen "Monday", z. B. würden Sie es wie im folgenden Beispiel deklarieren Day :

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

Felder werden unmittelbar vor dem Aufruf des Konstruktors für die Objektinstanz initialisiert. Wenn der Konstruktor den Wert eines Felds zuweist, überschreibt er einen beliebigen Wert, der während der Felddeklaration angegeben wird. Weitere Informationen finden Sie unter Verwenden von Konstruktoren.

Hinweis

Ein Feldinitialisierer kann nicht auf andere Instanzfelder verweisen.

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

Ein Feld kann optional deklariert staticwerden. Statische Felder sind jederzeit für Aufrufer verfügbar, auch wenn keine Instanz des Typs vorhanden ist. Weitere Informationen finden Sie unter "Static Classes" und "Static Class Members".

Ein Feld kann deklariert readonlywerden. Einem schreibgeschützten Feld kann nur während der Initialisierung oder in einem Konstruktor ein Wert zugewiesen werden. Ein static readonly Feld ähnelt einer Konstante, mit der Ausnahme, dass der C#-Compiler keinen Zugriff auf den Wert eines statischen schreibgeschützten Felds zur Kompilierungszeit hat, nur zur Laufzeit. Weitere Informationen finden Sie unter Konstanten.

Ein Feld kann deklariert requiredwerden. 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 jeder Konstruktordeklaration hinzu, die alle erforderlichen Member initialisiert.

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

Ab C# 12 sind primäre Konstruktorparameter eine Alternative zum Deklarieren von Feldern. Wenn Ihr Typ Abhängigkeiten aufweist, 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 deklarierter Felder in Ihren Typen verwendet werden. record Bei Typen werden primäre Konstruktorparameter als öffentliche Eigenschaften angezeigt.

C#-Sprachspezifikation

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

Siehe auch