Prohlídka jazyka C#

Jazyk 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 ekosystému .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.

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á _ sjednocený typ systému *. Všechny typy C#, včetně primitivních typů, jako jsou int a double , dědí z jednoho kořenového object typu. Všechny typy sdílejí sadu běžných operací. Hodnoty libovolného typu mohou být uloženy, přepravovány a provozovány konzistentním způsobem. Jazyk C# navíc podporuje uživatelsky definované typy odkazů i typy hodnot. Jazyk C# umožňuje dynamické přidělování objektů a vloženého úložiště lehkých struktur. Jazyk C# podporuje obecné metody a typy, které poskytují zvýšenou bezpečnost typů a výkon. Jazyk C# poskytuje iterátory, které umožňují implementátorům tříd kolekcí definovat vlastní chování pro klientský kód.

Jazyk C# zvýrazňuje správu verzí , aby bylo zajištěno, že programy a knihovny se budou v průběhu času vyvíjejí kompatibilním způsobem. Aspekty návrhu jazyka C#, které byly přímo ovlivněny aspekty správy verzí, zahrnují samostatné virtual a override modifikátory, pravidla pro řešení přetížení metod a podporu explicitních deklarací členů rozhraní.

Architektura .NET

Programy v jazyce C# běží na platformě .NET, což je virtuální spouštěcí systém nazvaný modul CLR (Common Language Runtime) a sada knihoven tříd. Modul CLR je implementací společnosti Microsoft pro mezinárodní standard (CLI) (Common Language Infrastructure). Rozhraní příkazového řádku je základem pro vytváření prostředí pro spouštění a vývoj, ve kterém jazyky a knihovny spolupracují bez problémů.

Zdrojový kód napsaný v jazyce C# je zkompilován do mezilehlého jazyka (IL) , který odpovídá specifikaci rozhraní příkazového řádku. Kód IL a prostředky, jako jsou bitmapy 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 v jazyce C# je sestavení načteno do CLR. Modul CLR provede kompilaci JIT (just-in-time) k převedení kódu 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" na rozdíl od "nespravovaného kódu", který 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++ nebo libovolného z 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 rozhraní .NET a 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í pro všechno od vstupu souboru a výstupu až po manipulaci s řetězci po parsování XML, až po architektury webových aplikací až model Windows Forms ovládacími prvky. 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á using direktivou, 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ů – například obor názvů obsahuje řadu typů, například třídu odkazovanou v programu a řadu dalších oborů názvů, například a System Console IO Collections . Direktiva, která odkazuje na daný obor názvů, umožňuje nekvalifikované použití typů, které jsou using členy daného oboru názvů. Kvůli using direktivě může program použít Console.WriteLine jako zkratku pro System.Console.WriteLine .

HelloTřída deklarovaná programem "Hello, World" má jednoho člena, metodu s názvem Main . MainMetoda je deklarována s static modifikátorem. I když metody instance mohou odkazovat na konkrétní ohraničující objekt instance pomocí klíčového slova this , statické metody pracují bez odkazů na konkrétní objekt. Podle konvence, statická metoda s názvem Main slouží jako vstupní bod programu v jazyce C#.

Výstup programu je vytvořen WriteLine metodou Console třídy v System oboru názvů. Tuto třídu poskytují standardní knihovny tříd, které jsou ve výchozím nastavení automaticky odkazovány kompilátorem.

Typy a proměnné

V jazyce C# existují dva druhy typů: typy hodnot a typy odkazů. Proměnné hodnotových typů přímo obsahují svá data. Proměnné referenčních typů ukládají odkazy na jejich data a ta se označují jako objekty. U typů odkazů je možné, že dvě proměnné odkazují na stejný objekt a mohou operace na jedné proměnné ovlivnit objekt, na který je odkazováno jinou proměnnou. S typy hodnot mají proměnné, které mají svou vlastní kopii dat, a není možné, že operace na jednom mají vliv na ostatní (s výjimkou ref out proměnných parametrů a).

Identifikátor je název proměnné. Identifikátor je posloupnost znaků Unicode bez mezer. Identifikátorem může být rezervované slovo jazyka C#, pokud je předpona @ . Použití rezervovaného slova jako identifikátoru může být užitečné při interakci s ostatními jazyky.

Typy hodnot jazyka C# jsou dále rozděleny na jednoduché typy, výčtové typy, typy struktury, typy hodnot s možnou hodnotou null a typy hodnoty řazené kolekce členů. Referenční typy jazyka C# jsou dále rozděleny do typů tříd, typů rozhraní, typů polí a typů delegátů.

Následující přehled 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ů.

  • 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é.

Všechny typy , , a podporují obecné typy, kde class mohou struct být interface delegate parametrizovány jinými typy.

Jazyk C# podporuje jednorozměrná a multidimenzionální pole libovolného typu. Na rozdíl od výše uvedených typů nemusí být typy polí deklarovány před jejich použitím. Místo toho jsou typy polí vytvořeny podle názvu typu s hranatými závorkami. Je například jednorozměrné pole typu , je dvojrozměrné pole typu a je jednorozměrné pole jednorozměrných polí int[] int int[,] int int[][] neboli "vícerozměrného" pole typu int .

Typy s možnou hodnotou null nevyžadují samostatnou definici. Pro každý typ, který nemůže mít hodnotu null, existuje odpovídající typ s možnou hodnotou null, který může T T? obsahovat další hodnotu null . Například je typ, který může int? obsahovat libovolné 32bitové celé číslo nebo hodnotu , a je typ, který může obsahovat libovolnou null hodnotu nebo string? string null .

Systém typů jazyka C# je sjednocený tak, že hodnotu libovolného typu lze považovat za object . Každý typ v jazyce C# je přímo nebo nepřímo odvozen z typu třídy a je nejvyšší základní object object třídou všech typů. S hodnotami odkazových typů se zachází jako s objekty jednoduše zobrazením hodnot jako typu object . S hodnotami hodnotových typů se zachází jako s objekty provedením operací balení a rozbalení. V následujícím příkladu je hodnota převedena na a int zpět na object int .

int i = 123;
object o = i;    // Boxing
int j = (int)o;  // Unboxing

Pokud je k odkazu přiřazena hodnota typu hodnoty, přidělí se pro object jeho použití pole. Toto pole je instancí typu odkazu a hodnota se zkopíruje do tohoto pole. Pokud je odkaz přetypován na typ hodnoty, je naopak provedena kontrola, zda je odkazovaný pole se object object správným typem hodnoty. Pokud je kontrola úspěšná, hodnota v poli se zkopíruje do typu hodnoty.

Sjednocený systém typů jazyka C# v podstatě znamená, že se s typy hodnot zachází object jako s 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říkladem členů jsou pole, metody, vlastnosti a události. Při kompilaci programů v jazyce C# jsou fyzicky zabalené do sestavení. Sestavení obvykle mají příponu souboru nebo , v závislosti na tom, zda implementují aplikace, nebo .exe .dll knihovny * . _

Jako malý příklad si představte sestavení, které obsahuje následující kód:

using System;

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 s názvem a a Push Pop vnořenou třídu s názvem Entry . Třída Entry dále obsahuje tři členy: pole s názvem , pole s názvem a next data konstruktor. je Stack obecná třída. Má jeden parametr typu, který je při použití nahrazen konkrétním T typem.

Poznámka

Zásobník je kolekce FILO (first in - last out). Na začátek zásobníku se přidávají nové prvky. Když je prvek odebrán, je odebrán z horní části zásobníku.

Sestavení obsahují spustitelný kód ve formě instrukcí jazyka IL (Intermediate Language) a symbolických informací ve formě metadat. Před jeho provedením kompilátor JIT (Just-In-Time) modulu .NET Common Language Runtime převede kód IL v sestavení na kód specifický pro procesor.

Vzhledem k tomu, že sestavení je samostatná jednotka funkcí obsahující kód i metadata, není v jazyce C# potřeba direktiv a #include souborů hlaviček. Veřejné typy a členy obsažené v konkrétním sestavení jsou v programu jazyka C# k dispozici jednoduše odkazováním na toto sestavení při kompilaci programu. Tento program například používá Acme.Collections.Stack třídu ze acme.dll sestavení:

using System;
using Acme.Collections;

class Example
{
    public static void Main()
    {
        var s = new 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
    }
}

Chcete-li zkompilovat tento program, bude nutné 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# se všechny zdrojové soubory zpracují společně a zdrojové soubory na sebe mohou volně odkazovat. 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.