Share via


Fält (programmeringsguide för C#)

Ett fält är en variabel av alla typer som deklareras direkt i en klass eller struct. Fält är medlemmar av deras innehållande typ.

En klass eller struct kan ha instansfält, statiska fält eller båda. Instansfält är specifika för en instans av en typ. Om du har en klass T, med ett instansfält F, kan du skapa två objekt av typen Toch ändra värdet F för i varje objekt utan att påverka värdet i det andra objektet. Ett statiskt fält tillhör däremot själva typen och delas mellan alla instanser av den typen. Du kan bara komma åt det statiska fältet med hjälp av typnamnet. Om du får åtkomst till det statiska fältet med ett instansnamn får du cs0176-kompileringsfel .

I allmänhet bör du deklarera private eller protected hjälpmedel för fält. Data som din typ exponerar för klientkod ska tillhandahållas via metoder, egenskaper och indexerare. Genom att använda dessa konstruktioner för indirekt åtkomst till interna fält kan du skydda dig mot ogiltiga indatavärden. Ett privat fält som lagrar data som exponeras av en offentlig egenskap kallas ett säkerhetskopieringslager eller ett bakgrundsfält. Du kan deklarera public fält, men sedan kan du inte hindra kod som använder din typ från att ange fältet till ett ogiltigt värde eller på annat sätt ändra ett objekts data.

Fält lagrar vanligtvis de data som måste vara tillgängliga för mer än en typmetod och måste lagras längre än livslängden för en enskild metod. En typ som representerar ett kalenderdatum kan till exempel ha tre heltalsfält: ett för månaden, ett för dagen och ett för året. Variabler som inte används utanför omfånget för en enskild metod bör deklareras som lokala variabler i själva metodtexten.

Fält deklareras i klass- eller structblocket genom att ange åtkomstnivå följt av typen följt av namnet på fältet. Till exempel:

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

Om du vill komma åt ett fält i en instans lägger du till en punkt efter instansnamnet följt av namnet på fältet, som i instancename._fieldName. Till exempel:

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

Ett fält kan ges ett initialt värde med hjälp av tilldelningsoperatorn när fältet deklareras. Om du till exempel automatiskt tilldelar Day fältet till "Monday"deklarerar Day du som i följande exempel:

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

Fält initieras omedelbart innan konstruktorn för objektinstansen anropas. Om konstruktorn tilldelar värdet för ett fält skrivs alla värden som anges under fältdeklarationen över. Mer information finns i Använda konstruktorer.

Kommentar

En fältinitierare kan inte referera till andra instansfält.

Fält kan markeras som public, private, protected, internal, protected internaleller private protected. Dessa åtkomstmodifierare definierar hur användare av typen kan komma åt fälten. Mer information finns i Åtkomstmodifierare.

Ett fält kan också deklareras static. Statiska fält är tillgängliga för anropare när som helst, även om det inte finns någon instans av typen. Mer information finns i Statiska klasser och Statiska klassmedlemmar.

Ett fält kan deklareras readonly. Ett skrivskyddat fält kan bara tilldelas ett värde under initieringen eller i en konstruktor. Ett static readonly fält liknar en konstant, förutom att C#-kompilatorn inte har åtkomst till värdet för ett statiskt skrivskyddat fält vid kompileringstillfället, endast vid körning. Mer information finns i Konstanter.

Ett fält kan deklareras required. Ett obligatoriskt fält måste initieras av konstruktorn eller av en objektinitierare när ett objekt skapas. Du lägger till System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute attributet i alla konstruktordeklarationer som initierar alla nödvändiga medlemmar.

Modifieraren required kan inte kombineras med readonly modifieraren i samma fält. Egenskapen kan dock bara vara required ochinit.

Från och med C# 12 är primära konstruktorparametrar ett alternativ till att deklarera fält. När din typ har beroenden som måste anges vid initieringen kan du skapa en primär konstruktor som tillhandahåller dessa beroenden. Dessa parametrar kan samlas in och användas i stället för deklarerade fält i dina typer. När det gäller record typer visas primära konstruktorparametrar som offentliga egenskaper.

Språkspecifikation för C#

Mer information finns i C#-språkspecifikationen. Språkspecifikationen är den slutgiltiga källan för C#-syntax och -användning.

Se även