Algoritmy a programování III

Týden 4

Struktura programu

Klíčovou organizační koncepcí v jazyce C# jsou programyobory názvůtypyčlenysestavení. 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:



{
    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;
        }
    }
}
" style="box-sizing: inherit; outline-color: inherit; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 1em; direction: ltr; border: 0px; padding: 0px; line-height: 1.3571; display: block; position: relative;">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í:


();
        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
    }
}
" style="box-sizing: inherit; outline-color: inherit; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 1em; direction: ltr; border: 0px; padding: 0px; line-height: 1.3571; display: block; position: relative;">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.