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 jejich 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 zveřejňuje klientský kód, 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 backingové 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. Pří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. Pří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. Pokud chcete pole automaticky přiřadit Day"Monday", například byste deklaroval Day jako v následujícím příkladu:

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

Pole jsou inicializována bezprostředně před konstruktorem instance objektu je volána. 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, , internalprivateprotected, , 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 Modifikátory accessu.

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 členy statické třídy.

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 required a init pouze.

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ů se parametry primárního record konstruktoru zobrazují jako veřejné vlastnosti.

specifikace jazyka C#

Další informace najdete v tématu Specifikace jazyka C#. Specifikace jazyka je úplným a rozhodujícím zdrojem pro syntaxi a použití jazyka C#.

Viz také