Úvod do tříd
Odkazové typy
Typ, který je definován jako class typ odkazu. V době běhu, pokud deklarujete proměnnou typu odkazu, proměnná obsahuje hodnotu, null dokud explicitně nevytvoříte instanci třídy pomocí new operátoru, nebo přiřadíte objekt kompatibilního typu, který mohl být 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;
Když je objekt vytvořen, je k dispozici dostatek paměti na spravované haldě pro daný objekt a proměnná obsahuje pouze odkaz na umístění daného objektu. Typy na spravované haldě vyžadují režii při jejich přidělování a v případě, že jsou uvolněny automatickou funkcí správy paměti modulu CLR, která se označuje jako uvolňování paměti. Uvolňování paměti je ale také vysoce optimalizované a ve většině scénářů nevytváří problém s výkonem. Další informace o uvolňování paměti najdete v tématu Automatická správa paměti a uvolňovánípaměti.
Deklarace tříd
Třídy jsou deklarovány pomocí class klíčového 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...
}
classKlíčovému slovu předchází úroveň přístupu. Protože public se používá v tomto případě, může kdokoli vytvořit instance této třídy. Název třídy následuje za class klíčovým slovem. Název třídy musí být platný název identifikátoruC#. Zbytek definice je tělo třídy, kde jsou definovány chování a data. Pole, vlastnosti, metody a události třídy jsou souhrnně označovány jako členy třídy.
Vytváření objektů
I když se někdy používají jako zaměnitelné, třída a objekt jsou různé věci. Třída definuje typ objektu, ale není to samotný objekt. Objekt je konkrétní entita založená na třídě a je někdy označována jako instance třídy.
Objekty lze vytvořit pomocí new klíčového slova následovaného názvem třídy, na které bude objekt založen, podobně jako toto:
Customer object1 = new Customer();
Když je vytvořena instance třídy, odkaz na objekt je předán zpět do programátora. V předchozím příkladu object1 je odkaz na objekt, který je založen na Customer . Tento odkaz odkazuje na nový objekt, ale neobsahuje data objektu samotné. Ve skutečnosti můžete vytvořit odkaz na objekt, aniž byste vůbec vytvořili objekt:
Customer object2;
Nedoporučujeme vytvářet odkazy na objekty, jako je předchozí ta, která neodkazuje na objekt, protože při pokusu o přístup k objektu prostřednictvím takového odkazu selže v době běhu. Takový odkaz však lze vytvořit tak, aby odkazoval na objekt, 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é odkazují na stejný objekt. Proto se všechny změny objektu provedené prostřednictvím object3 projeví v následných použitích object4 . Vzhledem k tomu, že objekty, které jsou založeny na třídách, jsou odkazovány odkazem, třídy jsou označovány jako typy odkazů.
Dědičnost tříd
Třídy plně podporují Dědičnost, základní charakteristiky 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 a 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 je provedeno 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...
}
Když třída deklaruje 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 přímo dědit pouze z jedné základní třídy. Protože však základní třída může dědit z jiné třídy, třída může nepřímo zdědit více základních tříd. Kromě toho třída může přímo implementovat jedno nebo více rozhraní. Další informace naleznete v tématu rozhraní.
Třída může být deklarována abstract . Abstraktní třída obsahuje abstraktní metody, které mají definici signatury, ale žádnou implementaci. Nelze vytvořit instanci abstraktních tříd. Lze je použít pouze prostřednictvím odvozených tříd, které implementují abstraktní metody. Naproti tomu zapečetěná třída nepovoluje 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 mohou být rozděleny mezi různé zdrojové soubory. Další informace naleznete v tématu částečné třídy a metody.
Příklad
Následující příklad definuje veřejnou třídu, která obsahuje automaticky implementovanou vlastnost, metodu a speciální metodu, která se nazývá konstruktor. Další informace naleznete v článcích vlastnosti, metodya konstruktory . Instance třídy se pak vytvoří s new klíčovým slovem.
using System;
public class Person
{
// Constructor that takes no arguments:
public Person()
{
Name = "unknown";
}
// Constructor that takes one argument:
public Person(string name)
{
Name = name;
}
// Auto-implemented readonly property:
public string Name { get; }
// Method that overrides the base class (System.Object) implementation.
public override string ToString()
{
return Name;
}
}
class TestPerson
{
static void Main()
{
// Call the constructor that has no parameters.
var person1 = new Person();
Console.WriteLine(person1.Name);
// Call the constructor that has one parameter.
var person2 = new Person("Sarah Jones");
Console.WriteLine(person2.Name);
// Get the string representation of the person2 instance.
Console.WriteLine(person2);
}
}
// Output:
// unknown
// Sarah Jones
// Sarah Jones
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#.