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é
set
get
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. get
set
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 get
set
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 Name
Price
, 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}");
Související oddíly
- Použití vlastností
- Vlastnosti rozhraní
- Porovnání mezi vlastnostmi a indexery
- Omezení přístupnosti přístupového objektu
- Automaticky implementované vlastnosti
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é
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro