Sdílet prostřednictvím


Pole (Průvodce programováním v C#)

Pole je proměnná libovolného typu, který je deklarován přímo ve třídě nebo struktuře. Pole jsou členy svého obsahujícího typu.

Třída nebo struktura mohou mít pole instance, statická pole nebo obojí. Pole instance jsou specifická pro instanci typu. Pokud máte třídu Ts polem Finstance , můžete vytvořit dva objekty typu Ta upravit hodnotu F v každém objektu, aniž by to mělo vliv na hodnotu v druhém objektu. Naproti tomu statické pole patří samotnému typu a je sdíleno mezi všemi instancemi tohoto typu. Ke statickému poli se dostanete pouze pomocí názvu typu. Pokud přistupujete ke statickému poli podle názvu instance, zobrazí se chyba CS0176 v době kompilace.

Obecně platí, že pro pole byste měli deklarovat private nebo protected přístupnost. Data, která váš typ vystavuje klientskému kódu, by měla být poskytována prostřednictvím metod, vlastností a indexerů. Pomocí těchto konstruktorů pro nepřímý přístup k interním polím můžete chránit před neplatnými vstupními hodnotami. Privátní pole, které ukládá data vystavená veřejnou vlastností, se nazývá záložní úložiště nebo pomocné pole. Můžete deklarovat public pole, ale pak nemůžete zabránit kódu, který používá váš typ, nastavit toto pole na neplatnou hodnotu nebo jinak změnit data objektu.

Pole obvykle ukládají data, která musí být přístupná pro více než jednu metodu typu, a musí být uložena po dobu delší než životnost jakékoli jedné metody. Například typ představující kalendářní datum může mít tři celočíselná pole: jedno pro měsíc, jedno pro den a jedno pro rok. Proměnné, které se nepoužívají mimo rozsah jedné metody, by se měly deklarovat jako místní proměnné v samotném těle metody.

Pole jsou deklarována v bloku třídy nebo struktury zadáním úrovně přístupu následované typem a názvem pole. Například:

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

Pokud chcete získat přístup k poli v instanci, přidejte tečku za název instance, za kterou následuje název pole, jako v instancename._fieldName. Například:

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

Pole může být dáno počáteční hodnotou pomocí operátoru přiřazení, když je pole deklarováno. Chcete-li automaticky přiřadit pole Day k "Monday", můžete například deklarovat Day podle následujícího příkladu:

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

Pole jsou inicializována bezprostředně před tím, než je zavolán konstruktor instance objektu. Pokud konstruktor přiřadí hodnotu pole, přepíše libovolnou hodnotu zadanou během deklarace pole. Další informace naleznete v tématu Použití konstruktorů.

Poznámka:

Inicializátor polí nemůže odkazovat na jiná pole instance.

Pole mohou být označena jako public, private, protected, internal, protected internal, nebo private protected. Tyto modifikátory přístupu definují, jak uživatelé typu mají přístup k polím. Další informace naleznete v tématu Přístupové modifikátory.

Pole lze volitelně deklarovat static. Statická pole jsou dostupná pro volající kdykoli, i když neexistuje žádná instance typu. Další informace naleznete v tématu Statické třídy a statičtí členové tříd.

Pole lze deklarovat readonly. Pole jen pro čtení lze přiřadit hodnotu pouze během inicializace nebo v konstruktoru. Pole static readonly se podobá konstantě s tím rozdílem, že kompilátor jazyka C# nemá přístup k hodnotě statického pole jen pro čtení v době kompilace, pouze za běhu. Další informace naleznete v tématu Konstanty.

Pole lze deklarovat required. Požadované pole musí být inicializováno konstruktorem nebo inicializátory objektů při vytvoření objektu. Atribut přidáte System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute do jakékoli deklarace konstruktoru, která inicializuje všechny požadované členy.

required Modifikátor nelze kombinovat s modifikátorem readonly ve stejném poli. Vlastnost však může být pouze a required.

Počínaje jazykem C# 12 jsou parametry primárního konstruktoru alternativou k deklarování polí. Pokud váš typ obsahuje závislosti, které je nutné zadat při inicializaci, můžete vytvořit primární konstruktor poskytující tyto závislosti. Tyto parametry mohou být zachyceny a použity místo deklarovaných polí ve vašich typech. V případě typů parametry primárního konstruktoru record vystupují jako veřejné vlastnosti.

Specifikace jazyka C#

Další informace najdete ve specifikaci jazyka C#. Specifikace jazyka je konečným zdrojem syntaxe a použití jazyka C#.

Viz také