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