Třídy jazyka C#

Návod

Začínáte s vývojem softwaru? Začněte nejprve kurzy Začínáme . Jakmile potřebujete modelovat objekty s chováním a stavem, setkáte se s třídami.

Máte zkušenosti v jiném jazyce? Třídy jazyka C# jsou podobné třídám v Java nebo C++. Prolistujte si část inicializátory objektů kvůli vzorům specifickým pro C# a podívejte se na Záznamy jako alternativu zaměřenou na data.

Třída je referenční typ, který definuje podrobný plán pro objekty. Při vytváření proměnné typu třídy obsahuje proměnná odkaz na objekt ve spravované haldě. Proměnná neobsahuje přímo data objektu. Přiřazení proměnné třídy k jiné proměnné zkopíruje odkaz, takže obě proměnné odkazují na stejný objekt. Třídy představují nejběžnější způsob, jak definovat vlastní typy v jazyce C#. Používejte je, když potřebujete složité chování, dědičnost nebo sdílenou identitu mezi odkazy.

Kdy použít třídy

Třídu použijte, když:

  • Typ má složité chování nebo spravuje proměnlivý stav.
  • K vytvoření základní třídy s odvozenými specializacemi nebo k vytvoření odvozeného typu, který rozšiřuje existující třídu, potřebujete dědičnost.
  • Instance představují sdílenou identitu, ne objekty, které mají stejné hodnoty. Dva odkazy na stejný objekt by měly zůstat synchronizované.
  • Typ je velký nebo dlouhodobý a má výhody přidělení haldy a referenční sémantiky.

Deklarujte třídu

Definujte třídu s klíčovým slovem class následovaným názvem typu. Volitelný modifikátor přístupu řídí viditelnost. Výchozí hodnota je internal. Zadejte public, abyste volajícím z jiných sestavení umožnili používat vaše typy.

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

    public Customer(string name) => Name = name;
}

Tělo třídy obsahuje pole, vlastnosti, metody a události, souhrnně označované jako členy třídy. Název musí být platný název identifikátoru jazyka C#.

Vytváření objektů

Třída definuje typ, ale není to samotný objekt. Vytvoříte objekt ( instanci třídy) s klíčovým slovem new :

var customer = new Customer("Allison");
Console.WriteLine(customer.Name); // Allison

Proměnná customer obsahuje odkaz na objekt, nikoli na samotný objekt. Ke stejnému objektu můžete přiřadit více proměnných. Změny v jednom odkazu jsou viditelné prostřednictvím druhého:

var c1 = new Customer("Grace");
var c2 = c1; // both variables reference the same object

c2.Name = "Hopper";
Console.WriteLine(c1.Name); // Hopper — c1 sees the change made through c2

Toto chování sdílení odkazů je jedním rozdílem mezi třídami a strukturami. U struktur přiřazení kopíruje data. Důležitější je, že třídy podporují dědičnost. Můžete vytvářet hierarchie, ve kterých odvozené typy opakovaně používají a specializují se na chování ze základní třídy. Struktury se nemohou účastnit hierarchií dědičnosti. Další informace o rozlišení naleznete v tématu Typy hodnot a odkazové typy.

Konstruktory a inicializace

Při vytváření instance chcete, aby její pole a vlastnosti byly inicializovány do užitečných hodnot. Jazyk C# nabízí několik přístupů: inicializátory polí, parametry konstruktoru, primární konstruktory a požadované vlastnosti.

Inicializátory polí nastavují výchozí hodnotu přímo u deklarace pole:

public class Container
{
    private int _capacity = 10;
}

Inicializátory polí přiřazují přiměřené výchozí nastavení k poli nebo vlastnosti. Tím se odlišují od následujících přístupů, kdy volající můžou poskytnout počáteční hodnotu.

Parametry konstruktoru vyžadují, aby volající zadali hodnoty:

public class Container
{
    private int _capacity;

    public Container(int capacity) => _capacity = capacity;
}

Primární konstruktory (C# 12+) přidávají parametry přímo do deklarace třídy. Tyto parametry jsou k dispozici v těle třídy:

public class Container(int capacity)
{
    private int _capacity = capacity;
}

Primární konstruktory a inicializátory polí mohou spolupracovat: inicializátor _capacity = capacity pole používá parametr primárního konstruktoru jako jeho hodnotu. Tento vzor umožňuje zachytit argumenty konstruktoru v polích s jednou stručnou deklarací.

Požadované vlastnosti vynucují, aby volající nastavily konkrétní vlastnosti prostřednictvím inicializátoru objektů:

public class Person
{
    public required string FirstName { get; set; }
    public required string LastName { get; set; }
}
// var missing = new Person(); // Error: required properties not set
var person = new Person { FirstName = "Grace", LastName = "Hopper" };
Console.WriteLine($"{person.FirstName} {person.LastName}"); // Grace Hopper

Podrobnější informace o vzorech konstruktoru, včetně ověřování parametrů a řetězení konstruktorů, najdete v tématu Konstruktory.

Statické třídy

Třídu static nelze instancovat a obsahuje pouze statické členy. Pomocí statických tříd uspořádejte pomocné metody, které nefungují s daty instance:

static class MathHelpers
{
    public static double CircleCircumference(double radius) =>
        2 * Math.PI * radius;
}
double circumference = MathHelpers.CircleCircumference(5.0);
Console.WriteLine($"Circumference: {circumference:F2}"); // Circumference: 31.42

Knihovna tříd .NET obsahuje mnoho statických tříd, například Math a Console. Statická třída je implicitně zapečetěná. Nemůžete z něj odvodit ani vytvořit jeho instanci.

Inicializátory objektů

Inicializátory objektů umožňují nastavit vlastnosti při vytváření objektu bez zápisu konstruktoru pro každou kombinaci hodnot:

class ConnectionOptions
{
    public string Host { get; init; } = "localhost";
    public int Port { get; init; } = 80;
    public bool UseSsl { get; init; }
}
var options = new ConnectionOptions
{
    Host = "db.example.com",
    Port = 5432,
    UseSsl = true
};
Console.WriteLine($"{options.Host}:{options.Port} (SSL: {options.UseSsl})");
// db.example.com:5432 (SSL: True)

Inicializátory objektů pracují s libovolnou přístupnou vlastností, která má set nebo init přistupující objekt. Kombinují přirozeně s vlastnostmi required a konstruktory, které přijímají některé parametry a umožňují volajícímu nastavit jiné.

Pokud je tato vlastnost kolekce, můžete k inicializaci objektu použít výrazy Kolekce (referenční dokumentace jazyka C# ).

Dědičnost

Třídy podporují dědičnost. Můžete definovat novou třídu, která znovu používá, rozšiřuje nebo upravuje chování existující třídy. Třída, ze které dědíte, je základní třída a nová třída je odvozená třída:

var manager = new Manager("Satya", "Engineering");
Console.WriteLine($"{manager.Name} manages {manager.Department}");
// Satya manages Engineering

Třída může dědit z jedné základní třídy a implementovat více rozhraní. Odvozené třídy dědí všechny členy základní třídy s výjimkou konstruktorů. Další informace naleznete v tématu Dědičnost a rozhraní.

Viz také