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 doublea , 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#virtualoverride, 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 IOCollectionsa . 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 thispomocí 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é ( refout 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#.

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.

  • classTyp 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.
  • structTyp 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 typu object .
  • interfaceTyp definuje kontrakt jako pojmenovanou sadu veřejných členů. classNebo struct , který implementuje interface , musí poskytnout implementace členů rozhraní. interfaceMůže dědit z více základních rozhraní a class nebo struct může implementovat více rozhraní.
  • delegateTyp 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ý.

classTypy, 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
    • nullHodnota nebo hodnota daného přesného typu
  • object
    • nullOdkaz, odkaz na objekt libovolného typu odkazu, nebo odkaz na zabalenou hodnotu libovolného typu hodnoty
  • Typ třídy
    • nullOdkaz, odkaz na instanci tohoto typu třídy nebo odkaz na instanci třídy odvozené z tohoto typu třídy
  • Typ rozhraní
    • nullOdkaz, 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
    • nullOdkaz, odkaz na instanci tohoto typu pole nebo odkaz na instanci kompatibilního typu pole
  • Typ delegáta
    • nullOdkaz 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 . EntryTřída dále obsahuje tři členy: vlastnost s názvem Next , vlastnost s názvem Data a konstruktor. StackJe 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.