Úvod do tříd

Typy odkazů

Typ, který je definován jako class odkazový typ. Když za běhu deklarujete proměnnou typu odkazu, proměnná obsahuje hodnotu null , dokud explicitně nevytvoříte instanci třídy pomocí operátoru new , nebo mu přiřadíte objekt kompatibilního typu, který byl vytvořen jinde, jak je znázorněno v následujícím příkladu:

//Declaring an object of type MyClass.
MyClass mc = new MyClass();

//Declaring another object of the same type, assigning it the value of the first object.
MyClass mc2 = mc;

Při vytvoření objektu je na spravované haldě pro tento konkrétní objekt přidělen dostatek paměti a proměnná obsahuje pouze odkaz na umístění uvedeného objektu. Paměť používaná objektem je uvolněna funkcí automatické správy paměti CLR, která se označuje jako uvolňování paměti. Další informace o uvolňování paměti naleznete v tématu Automatická správa paměti a uvolňování paměti.

Deklarace tříd

Třídy jsou deklarovány pomocí klíčového class slova následovaného jedinečným identifikátorem, jak je znázorněno v následujícím příkladu:

//[access modifier] - [class] - [identifier]
public class Customer
{
   // Fields, properties, methods and events go here...
}

Volitelný modifikátor přístupu předchází klíčovému slovu class . Protože public se v tomto případě používá, může kdokoli vytvořit instance této třídy. Název třídy se řídí klíčovým slovem class . Název třídy musí být platný název identifikátoru jazyka C#. Zbytek definice je tělo třídy, kde jsou definovány chování a data. Pole, vlastnosti, metody a události ve třídě se souhrnně označují jako členy třídy.

Vytváření objektů

I když se někdy používají zaměnitelně, třída a objekt jsou různé věci. Třída definuje typ objektu, ale nejedná se o samotný objekt. Objekt je konkrétní entita založená na třídě a někdy se označuje jako instance třídy.

Objekty lze vytvořit pomocí klíčového new slova následovaného názvem třídy, například takto:

Customer object1 = new Customer();

Při vytvoření instance třídy je odkaz na objekt předán zpět programátoru. V předchozím příkladu je odkaz na objekt, object1 který je založen na Customer. Tento odkaz odkazuje na nový objekt, ale neobsahuje samotná data objektu. Ve skutečnosti můžete vytvořit odkaz na objekt bez vytvoření objektu vůbec:

Customer object2;

Nedoporučujeme vytvářet odkazy na objekty, které neodkazují na objekt, protože pokus o přístup k objektu prostřednictvím takového odkazu selže za běhu. Odkaz lze vytvořit tak, aby odkazoval na objekt, a to buď vytvořením nového objektu, nebo přiřazením existujícího objektu, například takto:

Customer object3 = new Customer();
Customer object4 = object3;

Tento kód vytvoří dva odkazy na objekty, které oba odkazují na stejný objekt. Proto se všechny změny objektu provedeného prostřednictvím object3 se projeví v následných použitích object4. Vzhledem k tomu, že objekty založené na třídách jsou odkazovány odkazem, třídy jsou označovány jako odkazové typy.

Konstruktory a inicializace

Předchozí části zavedly syntaxi pro deklaraci typu třídy a vytvoření instance tohoto typu. Při vytváření instance typu chcete zajistit, aby se jeho pole a vlastnosti inicializovaly na užitečné hodnoty. Existuje několik způsobů, jak inicializovat hodnoty:

  • Přijmout výchozí hodnoty
  • Inicializátory polí
  • Parametry konstruktoru
  • Inicializátory objektů

Každý typ .NET má výchozí hodnotu. Obvykle je tato hodnota 0 pro číselné typy a null pro všechny odkazové typy. Na tuto výchozí hodnotu se můžete spolehnout, když je v aplikaci rozumná.

Pokud výchozí hodnota .NET není správná, můžete počáteční hodnotu nastavit pomocí inicializátoru polí:

public class Container
{
    // Initialize capacity field to a default value of 10:
    private int _capacity = 10;
}

Volající můžete vyžadovat, aby zadali počáteční hodnotu definováním konstruktoru, který je zodpovědný za nastavení této počáteční hodnoty:

public class Container
{
    private int _capacity;

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

Počínaje jazykem C# 12 můžete definovat primární konstruktor jako součást deklarace třídy:

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

Přidání parametrů do názvu třídy definuje primární konstruktor. Tyto parametry jsou k dispozici v těle třídy, která zahrnuje jeho členy. Můžete je použít k inicializaci polí nebo kdekoli jinde, kde jsou potřeba.

Můžete také použít required modifikátor vlastnosti a povolit volajícím použít inicializátor objektů nastavit počáteční hodnotu vlastnosti:

public class Person
{
    public required string LastName { get; set; }
    public required string FirstName { get; set; }
}

Přidání required klíčových slov vyžaduje, aby volající tyto vlastnosti nastavil jako součást výrazu new :

var p1 = new Person(); // Error! Required properties not set
var p2 = new Person() { FirstName = "Grace", LastName = "Hopper" };

Dědičnost tříd

Třídy plně podporují dědičnost, základní charakteristiku objektově orientovaného programování. Při vytváření třídy můžete dědit z jakékoli jiné třídy, která není definována jako sealed. Jiné třídy mohou dědit z vaší třídy a přepsat virtuální metody třídy. Kromě toho můžete implementovat jedno nebo více rozhraní.

Dědičnost se provádí pomocí odvození, což znamená, že třída je deklarována pomocí základní třídy , ze které dědí data a chování. Základní třída je určena připojením dvojtečky a názvem základní třídy za názvem odvozené třídy, například takto:

public class Manager : Employee
{
    // Employee fields, properties, methods and events are inherited
    // New Manager fields, properties, methods and events go here...
}

Pokud deklarace třídy obsahuje základní třídu, dědí všechny členy základní třídy s výjimkou konstruktorů. Další informace najdete v tématu Dědičnost.

Třída v jazyce C# může dědit pouze z jedné základní třídy. Protože se však základní třída může zdědit z jiné třídy, může třída nepřímo dědit více základních tříd. Třída navíc může přímo implementovat jedno nebo více rozhraní. Další informace naleznete v tématu Rozhraní.

Třídu lze deklarovat jako abstract. Abstraktní třída obsahuje abstraktní metody, které mají definici podpisu, ale žádnou implementaci. Abstraktní třídy nelze vytvořit instanci. Lze je použít pouze prostřednictvím odvozených tříd, které implementují abstraktní metody. Naproti tomu zapečetěná třída neumožňuje odvození jiných tříd. Další informace naleznete v tématu Abstraktní a zapečetěné třídy a členy třídy.

Definice tříd je možné rozdělit mezi různé zdrojové soubory. Další informace naleznete v části Částečné třídy a metody.

Specifikace jazyka C#

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