Týden 6
Rozhraní
Rozhraní definuje kontrakt, který lze implementovat pomocí tříd a struktur. Definujete rozhraní pro deklaraci schopností, které jsou sdíleny mezi různými typy. Rozhraní například definuje konzistentní způsob procházení System.Collections.Generic.IEnumerable<T> všech položek v kolekci, například pole. Rozhraní může obsahovat metody, vlastnosti, události a indexery. Rozhraní obvykle neposkytuje implementace členů, které definuje – pouze určuje členy, které musí být dodány třídami nebo strukturami, které implementují rozhraní.
Rozhraní mohou využívat více dědičnosti. V následujícím příkladu rozhraní IComboBox
dědí z obou ITextBox
a IListBox
.
interface IControl
{
void Paint();
}interface ITextBox : IControl
{
void SetText(string text);
}interface IListBox : IControl
{
void SetItems(string[] items);
}interface IComboBox : ITextBox, IListBox { }
Třídy a struktury mohou implementovat více rozhraní. V následujícím příkladu třída EditBox
implementuje a IControl
IDataBound
.
interface IDataBound
{
void Bind(Binder b);
}public class EditBox : IControl, IDataBound
{
public void Paint() { }
public void Bind(Binder b) { }
}
Když třída nebo struktura implementuje konkrétní rozhraní, instance této třídy nebo struktury lze implicitně převést na tento typ rozhraní. Například
EditBox editBox = new();
IControl control = editBox;
IDataBound dataBound = editBox;
Typ výčtu definuje sadu konstantních hodnot. Následující enum
kód deklaruje konstanty, které definují různé kořenové zeleniny:
public enum SomeRootVegetable
{
HorseRadish,
Radish,
Turnip
}
Můžete také definovat, který enum
se má použít v kombinaci jako příznaky. Následující deklarace deklaruje sadu vlajek pro čtyři roční období. Může být použita libovolná kombinace ročních období, včetně All
hodnoty, která zahrnuje všechna roční období:
[Flags]
public enum Seasons
{
None = 0,
Summer = 1,
Autumn = 2,
Winter = 4,
Spring = 8,
All = Summer | Autumn | Winter | Spring
}
Následující příklad ukazuje deklarace obou předchozích výčtů:
var turnip = SomeRootVegetable.Turnip;var spring = Seasons.Spring;
var startingOnEquinox = Seasons.Spring | Seasons.Autumn;
var theYear = Seasons.All;
Proměnné libovolného typu mohou být deklarovány jako nenulové nebo s možnou hodnotou null. Proměnná s možnou hodnotou null může obsahovat další null
hodnotu, která neudávají žádnou hodnotu. Typy hodnot s možnou hodnotou null (struktury nebo výčty) jsou reprezentovány hodnotou System.Nullable<T>. Referenční typy s možnou hodnotou null i odkaz s možnou hodnotou null jsou reprezentovány základním referenčním typem. Rozdíl je reprezentován metadaty přečtené kompilátorem a některými knihovnami. Kompilátor zobrazí upozornění při dereferencování odkazů s možnou hodnotou null, aniž by nejprve zkontroloval jejich hodnotu proti null
. Kompilátor také poskytuje upozornění, když je odkazům, které nemají hodnotu null, přiřazena hodnota, která může být null
. Následující příklad deklaruje int s možnou hodnotou null a inicializuje ho na null
. Pak nastaví hodnotu na 5
. Ukazuje stejný koncept s řetězcem s možnou hodnotou null. Další informace najdete v tématech typy hodnot s možnou hodnotou null a odkazové typy s možnou hodnotou null.
int? optionalInt = default;
optionalInt = 5;
string? optionalText = default;
optionalText = "Hello World.";
C# podporuje řazené kolekce členů, které poskytují stručnou syntaxi pro seskupení více datových prvků v jednoduché datové struktuře. Vytvoření instance řazené kolekce členů deklarací typů a názvů členů mezi (
a )
, jak je znázorněno v následujícím příkladu:
(double Sum, int Count) t2 = (4.5, 3);
Console.WriteLine($"Sum of {t2.Count} elements is {t2.Sum}.");
//Output:
//Sum of 3 elements is 4.5.