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

Vlastnost je člen, který poskytuje flexibilní mechanismus pro čtení, zápis nebo výpočet hodnoty privátního pole. Vlastnosti se dají použít, jako by to byly veřejné datové členy, ale jedná se o speciální metody označované jako přístupové objekty. Tato funkce umožňuje snadný přístup k datům a stále pomáhá podporovat bezpečnost a flexibilitu metod.

Přehled vlastností

  • Vlastnosti umožňují třídě zveřejnit veřejný způsob získání a nastavení hodnot při skrytí implementace nebo ověřovacího kódu.
  • K vrácení hodnoty vlastnosti slouží přístupové objekty get a k přiřazení nové hodnoty se používá objekt pro nastavení vlastnosti. Inicializační objekt vlastnosti se používá k přiřazení nové hodnoty pouze během vytváření objektů. Tyto přístupové objekty můžou mít různé úrovně přístupu. Další informace naleznete v tématu Omezení přístupnosti přístupového objektu.
  • Klíčové slovo hodnoty slouží k definování hodnoty, kterou set přiřazuje.init
  • Vlastnosti můžou být jen pro čtení (mají přístupové setget objekty i přístupové objekty), jen pro čtení (mají přístupové get objekty, ale žádné set přístupové objekty) nebo jen pro zápis (mají set přístupové objekty, ale žádné get přístupové objekty). Vlastnosti jen pro zápis jsou vzácné a nejčastěji se používají k omezení přístupu k citlivým datům.
  • Jednoduché vlastnosti, které nevyžadují žádný vlastní přístupový kód, lze implementovat buď jako definice těla výrazu, nebo jako automaticky implementované vlastnosti.

Vlastnosti se záložními poli

Jedním ze základních vzorů pro implementaci vlastnosti je použití privátního backingového pole pro nastavení a načtení hodnoty vlastnosti. Přistupující get objekt vrátí hodnotu soukromého pole a set přístupový objekt může před přiřazením hodnoty k privátnímu poli provést ověření dat. Oba přístupové objekty mohou také provádět převod nebo výpočty dat před uložením nebo vrácením.

Následující příklad znázorňuje tento vzor. V tomto příkladu TimePeriod třída představuje interval času. Třída interně ukládá časový interval v sekundách v privátním poli s názvem _seconds. Vlastnost Hours pro čtení a zápis umožňuje zákazníkovi zadat časový interval v hodinách. getset Mezi hodinami a sekundami provádějí potřebné převody mezi hodinami a sekundami. Kromě toho příslušenství ověří data a vyvolá ArgumentOutOfRangeException chybu, set pokud je počet hodin neplatný.

public class TimePeriod
{
    private double _seconds;

    public double Hours
    {
        get { return _seconds / 3600; }
        set
        {
            if (value < 0 || value > 24)
                throw new ArgumentOutOfRangeException(nameof(value),
                      "The valid range is between 0 and 24.");

            _seconds = value * 3600;
        }
    }
}

K vlastnostem můžete získat a nastavit hodnotu, jak je znázorněno v následujícím příkladu:

TimePeriod t = new TimePeriod();
// The property assignment causes the 'set' accessor to be called.
t.Hours = 24;

// Retrieving the property causes the 'get' accessor to be called.
Console.WriteLine($"Time in hours: {t.Hours}");
// The example displays the following output:
//    Time in hours: 24

Definice textu výrazu

Přístupové objekty vlastností se často skládají z jednořádkových příkazů, které pouze přiřazují nebo vracejí výsledek výrazu. Tyto vlastnosti můžete implementovat jako členy s body výrazu. Definice těla výrazu => se skládají z symbolu následovaného výrazem, který se má přiřadit nebo načíst z vlastnosti.

Vlastnosti jen pro get čtení mohou implementovat přístup jako člen typu výraz bodied. V tomto případě se get klíčové slovo pro přístup ani return klíčové slovo nepoužívá. Následující příklad implementuje vlastnost jen Name pro čtení jako člen-bodied výrazu.

public class Person
{
    private string _firstName;
    private string _lastName;

    public Person(string first, string last)
    {
        _firstName = first;
        _lastName = last;
    }

    public string Name => $"{_firstName} {_lastName}";
}

Oba get a set přístupové objekty lze implementovat jako členy s body výrazu. V tomto případě get musí být k dispozici klíčová slova a set klíčová slova. Následující příklad znázorňuje použití definic těla výrazu pro oba přístupové objekty. Klíčové return slovo se u přístupového objektu get nepoužívá.

public class SaleItem
{
    string _name;
    decimal _cost;

    public SaleItem(string name, decimal cost)
    {
        _name = name;
        _cost = cost;
    }

    public string Name
    {
        get => _name;
        set => _name = value;
    }

    public decimal Price
    {
        get => _cost;
        set => _cost = value;
    }
}

Automaticky implementované vlastnosti

V některých případech vlastnosti get a set přístupové objekty pouze přiřazují hodnotu nebo načítají hodnotu z backingového pole bez zahrnutí jakékoli další logiky. Pomocí automaticky implementovaných vlastností můžete kód zjednodušit, zatímco kompilátor jazyka C# transparentně poskytuje backingové pole za vás.

Pokud vlastnost má přístupové objekty i set přístupové objekty get (nebo get a a) init, musí být obě implementovány automaticky. Automaticky implementovanou vlastnost definujete pomocí get klíčových slov a set bez poskytnutí jakékoli implementace. Následující příklad opakuje předchozí s tím rozdílem, že Name a Price jsou automaticky implementovány vlastnosti. Příklad také odebere parametrizovaný konstruktor, takže SaleItem objekty jsou nyní inicializovány voláním konstruktoru bez parametrů a inicializátoru objektů.

public class SaleItem
{
    public string Name
    { get; set; }

    public decimal Price
    { get; set; }
}

Automaticky implementované vlastnosti můžou deklarovat různé přístupové vlastnosti a getset přístupové objekty. Běžně deklarujete veřejný get přístup a privátní set přístup. Další informace najdete v článku o omezení přístupnosti přístupových objektů.

Požadované vlastnosti

Počínaje jazykem C# 11 můžete přidat člena required , který vynutí inicializaci libovolné vlastnosti nebo pole klientského kódu:

public class SaleItem
{
    public required string Name
    { get; set; }

    public required decimal Price
    { get; set; }
}

Chcete-li vytvořit SaleItem, musíte nastavit jak vlastnosti NamePrice , tak pomocí inicializátorů objektů, jak je znázorněno v následujícím kódu:

var item = new SaleItem { Name = "Shoes", Price = 19.95m };
Console.WriteLine($"{item.Name}: sells for {item.Price:C2}");

Specifikace jazyka C#

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

Viz také