Prohlídka jazyka C#
C# (vyslovuje se "See Sharp") je moderní, objektově orientovaný a typově bezpečný programovací jazyk. Jazyk C# umožňuje vývojářům vytvářet mnoho typů zabezpečených a robustních aplikací, které běží v .NET. Jazyk C# má své kořeny v rodině jazyků C a programátorům v jazyce C, C++, Javě a JavaScriptu je hned povědomé. Tato prohlídka poskytuje přehled hlavních součástí jazyka v jazyce C# 8 a dřívějších verzích. Pokud chcete jazyk prozkoumat prostřednictvím interaktivních příkladů, vyzkoušejte úvod do kurzů jazyka C #.
C# je objektově orientovaný programovací jazyk orientovaný na komponenty. Jazyk C# poskytuje jazykové konstrukce pro přímou podporu těchto konceptů, díky kterým je jazyk C# přirozeným jazykem pro vytváření a používání softwarových komponent. Od svého původu přidává jazyk C# funkce pro podporu nových úloh a nově vznikajících postupů návrhu softwaru. V jádru je jazyk C# objektově orientovaný . Definujete typy a jejich chování.
Několik funkcí jazyka C# pomáhá vytvářet robustní a odolné aplikace. Uvolňování paměti automaticky uvolňuje paměť zabíranou nedostupnými nepoužívanými objekty. Typy s možnou hodnotou null chrání před proměnnými, které odkazují na přidělené objekty. Zpracování výjimek poskytuje strukturovaný a rozšiřitelný přístup k detekci a obnovení chyb. Výrazy lambda podporují techniky funkčního programování. Syntaxe LINQ (Language Integrated Query) vytváří společný vzor pro práci s daty z libovolného zdroje. Jazyková podpora asynchronních operací poskytuje syntaxi pro vytváření distribuovaných systémů. Jazyk C# má jednotný systém typů. Všechny typy jazyka C#, včetně primitivních typů, jako int
jsou double
a , dědí z jednoho kořenového object
typu. Všechny typy sdílejí sadu běžných operací. Hodnoty libovolného typu lze ukládat, převozovat a pracovat s hodnotami konzistentním způsobem. Jazyk C# navíc podporuje jak typy odkazů definované uživatelem , tak typy hodnot. Jazyk C# umožňuje dynamické přidělování objektů a v řádku úložiště zjednodušených struktur. Jazyk C# podporuje obecné metody a typy, které poskytují vyšší bezpečnost typů a výkon. Jazyk C# poskytuje iterátory, které implementátorům tříd kolekcí umožňují definovat vlastní chování pro klientský kód.
Jazyk C# klade důraz na verzi , aby se programy a knihovny v průběhu času vyvíjely kompatibilním způsobem. Aspekty návrhu jazyka C#virtual
override
, které byly přímo ovlivněny aspekty verzí, zahrnují samostatné modifikátory a , pravidla pro řešení přetížení metody a podporu explicitních deklarací členů rozhraní.
Architektura .NET
Programy v jazyce C# běží na .NET, virtuálním systému spouštění s názvem Common Language Runtime (CLR) a sadě knihoven tříd. CLR je implementace společné jazykové infrastruktury (CLI), která je mezinárodní standard od Microsoftu. Rozhraní příkazového řádku je základem pro vytváření prostředí pro spouštění a vývoj, ve kterých jazyky a knihovny bezproblémově spolupracují.
Zdrojový kód napsaný v jazyce C# je zkompilován do přechodného jazyka (IL), který odpovídá specifikaci rozhraní příkazového řádku. Kód a prostředky jazyka IL, jako jsou rastrové obrázky a řetězce, jsou uloženy v sestavení, obvykle s příponou .dll. Sestavení obsahuje manifest, který poskytuje informace o typech, verzi a jazykové verzi sestavení.
Při spuštění programu jazyka C# je sestavení načteno do modulu CLR. Modul CLR provádí kompilaci JIT (Just-In-Time), aby převádí kód IL na nativní instrukce počítače. Modul CLR poskytuje další služby související s automatickým uvolňováním paměti, zpracováním výjimek a s právy pro správu prostředků. Kód, který je spuštěn clr, se někdy označuje jako "spravovaný kód". "Nespravovaný kód" je zkompilován do nativního strojového jazyka, který cílí na konkrétní platformu.
Interoperabilita jazyků je klíčovou funkcí rozhraní .NET. Kód IL vytvořený kompilátorem jazyka C# odpovídá specifikaci CTS (Common Type Specification). Kód IL vygenerovaný z jazyka C# může pracovat s kódem, který byl vygenerován z verzí .NET jazyka F#, Visual Basic, C++. Existuje více než 20 dalších jazyků kompatibilních se standardem CTS. Jedno sestavení může obsahovat více modulů napsaných v různých jazycích .NET. Typy mohou odkazovat na sebe navzájem, jako by byly napsány ve stejném jazyce.
Kromě služeb za běhu obsahuje .NET také rozsáhlé knihovny. Tyto knihovny podporují mnoho různých úloh. Jsou uspořádané do oborů názvů, které poskytují širokou škálu užitečných funkcí. Knihovny zahrnují vše od vstupu souboru a výstupu až po manipulaci s řetězci po analýzu XML až po architektury webových aplikací až Windows Forms. Typická aplikace jazyka C# ve velké části využívá knihovnu tříd .NET ke zpracování běžných "instalačně".
Další informace o rozhraní .NET najdete v tématu Přehled rozhraní .NET.
Hello World
Program "Hello, World" se tradičně používá k zavedení programovacího jazyka. Tady je v jazyce C#:
using System;
class Hello
{
static void Main()
{
Console.WriteLine("Hello, World");
}
}
Program "Hello, World" začíná direktivou using
, která odkazuje na obor System
názvů . Obory názvů poskytují hierarchický způsob uspořádání programů a knihoven jazyka C#. Obory názvů obsahují typy a další obory názvů – System
například obor názvů obsahuje řadu typů, Console
například třídu odkazovanou v programu a řadu dalších oborů názvů, například IO
Collections
a . Direktiva using
, která odkazuje na daný obor názvů, umožňuje nekvalifikované použití typů, které jsou členy daného oboru názvů. Kvůli direktivě using
může program použít jako Console.WriteLine
zkratku pro System.Console.WriteLine
.
Třída Hello
deklarovaná programem "Hello, World" má jeden člen, metodu s názvem Main
. Metoda Main
je deklarována pomocí static
modifikátoru . Zatímco metody instance mohou odkazovat na konkrétní ohraničující instanci objektu this
pomocí klíčového slova , statické metody pracují bez odkazu na konkrétní objekt. Podle konvence slouží statická metoda s Main
názvem jako vstupní bod programu v jazyce C#.
Výstup programu je vytvořen metodou WriteLine
třídy Console
v oboru System
názvů . Tato třída je poskytována standardními knihovnami tříd, na které ve výchozím nastavení kompilátor automaticky odkazuje.
Typy a proměnné
Typ definuje strukturu a chování všech dat v jazyce C#. Deklarace typu může obsahovat jeho členy, základní typ, rozhraní, která implementuje, a operace povolené pro tento typ. Proměnná je popisek, který odkazuje na instanci konkrétního typu.
V jazyce C# existují dva typy typů: typy hodnot a odkazové typy. Proměnné hodnotových typů přímo obsahují svá data. Proměnné odkazových typů ukládají odkazy na jejich data, druhá se označuje jako objekty. U odkazových typů je možné, aby dvě proměnné odkazovala na stejný objekt a aby operace s jednou proměnnou ovlivnily objekt, na který odkazuje druhá proměnná. U hodnotových typů mají proměnné svou vlastní kopii dat a není možné, aby operace na jedné ovlivnily ty druhé ( ref
out
s výjimkou proměnných parametrů a ).
Identifikátor je název proměnné. Identifikátor je posloupnost znaků Unicode bez prázdných znaků. Identifikátorem může být vyhrazené slovo jazyka C#, pokud má předponu @
. Použití vyhrazeného slova jako identifikátoru může být užitečné při interakci s jinými jazyky.
Typy hodnot jazyka C# jsou dále rozděleny na jednoduché typy, typy výčtu , typystruktur, typy hodnot s možnou hodnotou null a typy hodnot řazené kolekce členů. Odkazové typy jazyka C# jsou dále rozděleny na typy tříd, typy rozhraní, typy polí a typy delegátů.
Následující osnova poskytuje přehled systému typů jazyka C#.
- Typy hodnot
- Jednoduché typy
- Integrální číslo se znaménkem: ,
short
,int
long
- Integrální funkce bez znaménka: ,
ushort
,uint
ulong
- Znaky Unicode: , který představuje jednotku kódu UTF-16
- Binární binární číslo IEEE s plovoucí desetinnou čárkou: ,
double
- S vysokou přesností na desetinnou čárku:
- Logická hodnota:
bool
, která představuje logické hodnoty – hodnoty, které jsou buď , nebotrue
false
- Integrální číslo se znaménkem: ,
- Výčtové typy
- Uživatelem definované typy formuláře
enum E {...}
. Typenum
je jedinečný typ s pojmenovanou konstantou. Každýenum
typ má základní typ, který musí být jedním z osmi integrálních typů. Sada hodnot typuenum
je stejná jako sada hodnot podkladového typu.
- Uživatelem definované typy formuláře
- Typy struktur
- Uživatelem definované typy formuláře
struct S {...}
- Uživatelem definované typy formuláře
- Typy hodnot s povolenou hodnotou Null
- Rozšíření všech ostatních typů hodnot s
null
hodnotou
- Rozšíření všech ostatních typů hodnot s
- Typy hodnot řazené kolekce členů
- Uživatelem definované typy formuláře
(T1, T2, ...)
- Uživatelem definované typy formuláře
- Jednoduché typy
- Odkazové typy
- Typy tříd
- Nejvyšší základní třída všech ostatních typů:
object
- Řetězce Unicode: , které představují posloupnost jednotek kódu UTF-16
- Uživatelem definované typy formuláře
class C {...}
- Nejvyšší základní třída všech ostatních typů:
- Typy rozhraní
- Uživatelem definované typy formuláře
interface I {...}
- Uživatelem definované typy formuláře
- Typy polí
- Jednorozměrné, multidimenzionální a zubatější. Například:
int[]
,int[,]
, aint[][]
- Jednorozměrné, multidimenzionální a zubatější. Například:
- Typy delegátů
- Uživatelem definované typy formuláře
delegate int D(...)
- Uživatelem definované typy formuláře
- Typy tříd
Programy v jazyce C# používají deklarace typů k vytváření nových typů. Deklarace typu Určuje název a členy nového typu. Šest kategorií typů v jazyce C# je uživatelsky definované: typy tříd, typy struktury, typy rozhraní, typy výčtu, typy delegátů a typy hodnot řazené kolekce členů. Můžete také deklarovat record
typy, buď record struct
nebo record class
. Typy záznamů mají členy syntetizované kompilátorem. Záznamy slouží hlavně pro ukládání hodnot s minimálním přidruženým chováním.
class
Typ definuje datovou strukturu obsahující datové členy (pole) a členy funkce (metody, vlastnosti a další). Typy tříd podporují jednu dědičnost a polymorfismus, mechanismy, které mohou odvozené třídy roztáhnout a specializovat základní třídy.struct
Typ je podobný typu třídy v tom, že představuje strukturu s datovými členy a členy funkce. Nicméně na rozdíl od tříd, struktury jsou typy hodnot a obvykle nevyžadují přidělení haldy. Typy struktury nepodporují uživatelem zadanou dědičnost a všechny typy struktury implicitně dědí z typuobject
.interface
Typ definuje kontrakt jako pojmenovanou sadu veřejných členů.class
Nebostruct
, který implementujeinterface
, musí poskytnout implementace členů rozhraní.interface
Může dědit z více základních rozhraní aclass
nebostruct
může implementovat více rozhraní.delegate
Typ představuje odkazy na metody s konkrétním seznamem parametrů a návratovým typem. Delegáti umožňují zacházet s metodami jako s entitami, které lze přiřadit proměnným a předávat jako parametry. Delegáti jsou analogické jako typy funkcí poskytované funkčními jazyky. Jsou také podobné konceptu ukazatelů funkcí nalezených v některých jiných jazycích. Na rozdíl od ukazatelů na funkce jsou delegáti objektově orientovaný a typově bezpečný.
class
Typy, struct
, interface
a delegate
podporují obecné typy, na jejichž základě lze parametry používat s jinými typy.
Jazyk C# podporuje jednorozměrné a multidimenzionální pole libovolného typu. Na rozdíl od typů uvedených výše nemusí být typy polí deklarovány dříve, než mohou být použity. Místo toho jsou typy polí konstruovány pomocí názvu typu s hranatými závorkami. Například int[]
je int
jednorozměrné pole, int[,]
je dvourozměrné pole int
, a int[][]
je jednorozměrné pole jednorozměrného pole nebo "vícenásobné" pole z int
...
Typy s možnou hodnotou null nevyžadují samostatnou definici. Pro každý typ T
, který nepovoluje hodnotu null, existuje odpovídající typ T?
s možnou hodnotou null, který může obsahovat další hodnotu, null
. int?
Například je typ, který může obsahovat libovolné 32 celé číslo nebo hodnotu null
a string?
je typ, který může obsahovat libovolnou string
hodnotu null
nebo.
Systém typů jazyka C# je sjednocením, aby hodnota libovolného typu mohla být považována object
za. Každý typ v jazyce C# přímo nebo nepřímo je odvozen z object
typu třídy a object
je nejvyšší základní třídou všech typů. Hodnoty typů odkazů se považují za objekty pouhým zobrazením hodnot jako typu object
. Hodnoty typů hodnot se považují za objekty prováděním operací zabalení a rozbalení. V následujícím příkladu int
je hodnota převedena na object
a zpět na int
.
int i = 123;
object o = i; // Boxing
int j = (int)o; // Unboxing
Při přiřazení hodnoty typu hodnoty k object
odkazu je "pole" přiděleno pro uchování hodnoty. Toto pole je instancí typu odkazu a hodnota je zkopírována do tohoto pole. Naopak, pokud object
je odkaz přetypování na typ hodnoty, je provedena kontrolu, že odkazovaná object
je pole správného typu hodnoty. Pokud je ověření úspěšné, je hodnota v poli zkopírována na typ hodnoty.
Sjednocený Typový systém v jazyce C# znamená, že typy hodnot jsou považovány object
za odkazy na vyžádání. Z důvodu sjednocení, knihovny pro obecné účely, které používají typ object
, lze použít se všemi typy odvozenými z object
, včetně typů odkazů a typů hodnot.
V jazyce C# existuje několik druhů proměnných , včetně polí, prvků pole, místních proměnných a parametrů. Proměnné reprezentují umístění úložiště. Každá proměnná má typ, který určuje, jaké hodnoty mohou být uloženy v proměnné, jak je znázorněno níže.
- Typ hodnoty, která není null
- Hodnota, která má přesný typ
- Typ hodnoty s možnou hodnotou null
null
Hodnota nebo hodnota daného přesného typu
- object
null
Odkaz, odkaz na objekt libovolného typu odkazu, nebo odkaz na zabalenou hodnotu libovolného typu hodnoty
- Typ třídy
null
Odkaz, odkaz na instanci tohoto typu třídy nebo odkaz na instanci třídy odvozené z tohoto typu třídy
- Typ rozhraní
null
Odkaz, odkaz na instanci typu třídy, která implementuje tento typ rozhraní, nebo odkaz na zabalenou hodnotu typu hodnoty, který implementuje tento typ rozhraní
- Typ pole
null
Odkaz, odkaz na instanci tohoto typu pole nebo odkaz na instanci kompatibilního typu pole
- Typ delegáta
null
Odkaz nebo odkaz na instanci kompatibilního typu delegáta
Struktura programu
Klíčovou organizační koncepcí v jazyce C# jsou programy, obory názvů, typy, členya sestavení. Programy deklarují typy, které obsahují členy a mohou být uspořádány do oborů názvů. Příklady typů jsou třídy, struktury a rozhraní. Příklady členů jsou pole, metody, vlastnosti a události. Když jsou programy C# kompilovány, jsou fyzicky zabaleny do sestavení. Sestavení mají obvykle příponu .exe
souboru nebo .dll
v závislosti na tom, zda implementují .exe
nebo knihovny, v uvedeném pořadí.
Jako malý příklad zvažte sestavení, které obsahuje následující kód:
namespace Acme.Collections;
public class Stack<T>
{
Entry _top;
public void Push(T data)
{
_top = new Entry(_top, data);
}
public T Pop()
{
if (_top == null)
{
throw new InvalidOperationException();
}
T result = _top.Data;
_top = _top.Next;
return result;
}
class Entry
{
public Entry Next { get; set; }
public T Data { get; set; }
public Entry(Entry next, T data)
{
Next = next;
Data = data;
}
}
}
Plně kvalifikovaný název této třídy je Acme.Collections.Stack
. Třída obsahuje několik členů: pole s názvem _top
, dvě metody pojmenované Push
a Pop
a vnořená třída s názvem Entry
. Entry
Třída dále obsahuje tři členy: vlastnost s názvem Next
, vlastnost s názvem Data
a konstruktor. Stack
Je Stack
třída. Má jeden parametr typu, který je nahrazen konkrétním typem, T
když je použit.
Zásobník je kolekce "first in-last-out" (filo). Do horní části zásobníku jsou přidány nové prvky. Když je prvek odebrán, je odebrán z horní části zásobníku. Předchozí příklad deklaruje Stack
typ, který definuje úložiště a chování pro zásobník. Můžete deklarovat proměnnou, která odkazuje na instanci Stack
typu pro použití této funkce.
Sestavení obsahují spustitelný kód ve formě instrukcí pro převodní jazyk (IL) a symbolické informace ve formě metadat. Předtím, než se spustí, kompilátor JIT (just-in-time) prostředí .NET Common Language Runtime převede kód IL v sestavení na kód specifický pro procesor.
Vzhledem k tomu, že sestavení je samo-popisující jednotku funkcí obsahující kód i metadata, není nutné #include
direktivy a hlavičkové soubory v jazyce C#. Veřejné typy a členy obsažené v konkrétním sestavení jsou zpřístupněny v programu v jazyce C# pouhým odkazováním na toto sestavení při kompilování programu. Například tento program používá Acme.Collections.Stack
třídu ze acme.dll
sestavení:
class Example
{
public static void Main()
{
var s = new Acme.Collections.Stack<int>();
s.Push(1); // stack contains 1
s.Push(10); // stack contains 1, 10
s.Push(100); // stack contains 1, 10, 100
Console.WriteLine(s.Pop()); // stack contains 1, 10
Console.WriteLine(s.Pop()); // stack contains 1
Console.WriteLine(s.Pop()); // stack is empty
}
}
Pro zkompilování tohoto programu byste se museli odkazovat na sestavení obsahující třídu zásobníku definovanou v předchozím příkladu.
Programy v jazyce C# mohou být uloženy v několika zdrojových souborech. Při kompilaci programu v jazyce C# jsou všechny zdrojové soubory zpracovávány společně a zdrojové soubory mohou volně odkazovat na sebe. V koncepčním případě je to, že všechny zdrojové soubory byly před zpracováním sloučeny do jednoho velkého souboru. Předávací deklarace nejsou v jazyce C# nikdy potřeba, protože s malým počtem výjimek je pořadí deklarací nedůležité. C# neomezuje zdrojový soubor na deklaraci pouze jednoho veřejného typu, ani nevyžaduje název zdrojového souboru, aby odpovídal typu deklarovanému ve zdrojovém souboru.
Další články v této prohlídce vysvětlují tyto organizační bloky.
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro