Vlastnosti (Properties) v C# představují mechanismus pro přístup k datům ve třídě. Chovají se podobně jako veřejné proměnné (fieldy), ale umožňují zapouzdřit logiku čtení a zápisu hodnoty.
Jsou tedy „chytrou obálkou“ kolem privátních fieldů, které umožňují:
kontrolu nad tím, jak a kdy se hodnota čte nebo zapisuje
provádění validačních pravidel
ochranu dat (skrze zapouzdření)
Příklad:
public class Person{ private string name; public string Name { get { return name; } set { name = value; } }}
Použití:
var person = new Person();person.Name = "Alice";Console.WriteLine(person.Name);
Syntaxe
Plná syntaxe
Klasická vlastnost obsahuje:
getter – metoda pro čtení hodnoty
setter – metoda pro nastavení hodnoty
public string Name{ get { return name; } set { name = value; }}
get se používá při čtení hodnoty
set se používá při přiřazení hodnoty
Klíčové slovo value
Slovo value je v tomto kontextu klíčovým slovém, které reprezentuje roli proměnné s uloženou hodnotou, kterou uživatel nastavuje.
Například:
x.Name = "Pepa";
Hodnota value bude “Pepa”;
Umístění logiky
Do vlastností lze vložit jakoukoliv logiku, například validaci:
private int age;public int Age{ get { return age; } set { if (value < 0) throw new ArgumentOutOfRangeException(nameof(value), "Věk nemůže být záporný."); age = value; }}
Automaticky implementované vlastnosti
V běžné praxi často není potřeba psát vlastní get/set logiku. Je možné využít automaticky implementovanou vlastnost.
public string Name { get; set; }
Kompilátor automaticky vytvoří privátní field na pozadí. Vypadá to po kompilaci do mezijazyka takhle:
[CompilerGenerated]private string <Name>k__BackingField;public string Name{ [CompilerGenerated] get { return <Name>k__BackingField; } [CompilerGenerated] set { <Name>k__BackingField = value; }}
Modifikátory přístupu
Je možné omezit přístup k části vlastnosti:
public string Name { get; private set; }
veřejně lze hodnotu číst
zapisovat ji lze jen zevnitř třídy
Pouze pro čtení
Vlastnosti, které nemají set jsou pouze pro čtení. Jejich hodnota může být nastavena v konstruktoru.
public string Name { get; }
Init-only vlastnosti
Od C# 9.0 je možné vlastnosti inicializovat pouze při vytvoření objektu, ale dál už ne:
public class Person{ public string Name { get; init; }}
Použití:
var person = new Person{ Name = "Alice"};// person.Name = "Bob"; // chyba – nelze měnit po vytvoření objektu