Sdílet prostřednictvím


Rozdíly mezi šablonami C++ a obecnými typy C# (Průvodce programováním v C#)

Obecné typy jazyka C# a šablony jazyka C++, které poskytují podporu pro parametrizované typy. Mezi těmito dvěma rozdíly ale existuje mnoho rozdílů. Obecné typy jazyka C# jsou na úrovni syntaxe jednodušším přístupem k parametrizovaným typům bez složitosti šablon jazyka C++. Kromě toho se jazyk C# nepokouší poskytovat všechny funkce, které poskytují šablony jazyka C++. Na úrovni implementace je primární rozdíl v tom, že nahrazení obecného typu jazyka C# se provádí za běhu a obecné informace o typu se tím zachovají pro vytváření instancí objektů. Další informace naleznete v tématu Obecné typy v modulu runtime.

Tady jsou hlavní rozdíly mezi obecnými typy jazyka C# a šablonami jazyka C++:

  • Obecné typy jazyka C# neposkytují stejnou flexibilitu jako šablony jazyka C++. Například není možné volat aritmetické operátory v obecné třídě jazyka C#, i když je možné volat uživatelem definované operátory.

  • Jazyk C# neumožňuje parametry šablony bez typu, například template C<int i> {}.

  • Jazyk C# nepodporuje explicitní specializaci; to znamená vlastní implementace šablony pro určitý typ.

  • Jazyk C# nepodporuje částečnou specializaci: vlastní implementaci pro podmnožinu argumentů typu.

  • Jazyk C# neumožňuje použití parametru typu jako základní třídy pro obecný typ.

  • Jazyk C# neumožňuje, aby parametry typu měly výchozí typy.

  • V jazyce C# nemůže být obecný parametr obecného typu, i když vytvořené typy lze použít jako obecné typy. C++ povoluje parametry šablony.

  • Jazyk C++ umožňuje kód, který nemusí být platný pro všechny parametry typu v šabloně, která se pak kontroluje pro konkrétní typ použitý jako parametr typu. Jazyk C# vyžaduje, aby kód třídy byl napsán takovým způsobem, aby fungoval s libovolným typem, který splňuje omezení. V jazyce C++ je například možné napsat funkci, která používá aritmetické operátory + a - na objektech parametru typu, což v době vytvoření instance šablony způsobí chybu s typem, který tyto operátory nepodporuje. C# to nepovoluje; jediné povolené jazykové konstrukce jsou ty, které lze od omezení odvodit.

Viz také