Specifikace CLS (Common Language Specification)

K plné interakci s jinými objekty bez ohledu na jazyk, ve kterém byly implementovány, musí objekty zveřejnit volajícím pouze ty vlastnosti, které jsou společné pro všechny jazyky, se kterými musí spolupracovat. Z tohoto důvodu byla definována specifikace CLS (Common Language Specification), což je sada základních vlastností jazyka potřebných pro mnoho aplikací. Pravidla specifikace CLS definují podmnožinu Specifikace CTS (Common Type System); to jsou všechna pravidla, která se týkají specifikace CTS (Common Type System) a jsou použita u specifikace CLS, s výjimkou přísnějších pravidel, která jsou definována ve specifikaci CLS. Specifikace CLS pomáhá zlepšit a zajistit vzájemnou funkční spolupráci jazyků definováním sady vlastností. Vývojáři se mohou spolehnout na to, že bude dostupná v celé řadě jazyků. Specifikace CLS také stanovuje požadavky pro dodržení specifikace CLS; ty vám pomáhají určit, zda váš spravovaný kód vyhovuje specifikaci CLS a v jakém rozsahu daný nástroj podporuje vývoj spravovaného kódu, který používá vlastnosti specifikace CLS.

Pokud vaše komponenta používá pouze vlastnosti specifikace CLS v API rozhraní, které ji zveřejní dalšímu kódu (včetně odvozených tříd), tak je garantováno, že bude přístupná z libovolného programovacího jazyka, který podporuje specifikaci CLS. Komponenty, které dodržují pravidla specifikace CLS a používají pouze vlastnosti, které jsou zahrnuty ve specifikaci CLS, jsou označeny jako komponenty odpovídající specifikaci CLS.

Většina členů definovaných pomocí typů v .NET Framework Class Library odpovídá specifikaci CLS. Avšak některé typy v knihovně tříd mají jeden nebo více členů, které nejsou kompatibilní se specifikací CLS. Tyto členy umožňují podporu pro vlastnosti jazyka, které nejsou ve specifikaci CLS. Typy a členy, které neodpovídají specifikaci CLS, jsou jako takové identifikovány v referenční dokumentaci a ve všech případech je k dispozici alternativa odpovídající specifikaci CLS. Další informace o typech v knihovně tříd rozhraní .NET Framework naleznete v tématu .NET Framework Class Library.

Specifikace CLS byla navržena tak, aby byla dostatečně velká k zahrnutí konstrukcí jazyka, které vývojáři běžně potřebují, stále je však dostatečně malá, takže většina jazyků je schopna ji podporovat. Kromě toho jakákoliv jazyková konstrukce, díky které je nemožné rychle ověřit bezpečnost typů kódu, byla vyloučena ze specifikace CLS, takže všechny jazyky odpovídající specifikaci CLS mohou vytvářet ověřitelný kód, pokud se tak rozhodnou. Další informace o ověření bezpečnosti typů naleznete v tématu Proces spravovaného spouštění.

Následující tabulka shrnuje vlastnosti, které jsou ve specifikaci CLS a označuje, zda se vlastnost vztahuje, jak na vývojáře, tak na kompilátory (všechny) nebo pouze na kompilátory. Tabulka je informativní nikoliv vyčerpávající. Další informace naleznete ve specifikaci pro Common Language Infrastructure, oddíl I, která je k dispozici na webu Microsoft Developer Network (MSDN).

Funkce

Vztahuje se k

Popis

Obecná

   

   

Viditelnost

Vše

Pravidla specifikace CLS se vztahují pouze na ty části typu, které jsou vystaveny mimo definiční sestavení.

Globální členy

Všechny

Globální statické položky a metody neodpovídají specifikaci CLS.

Pojmenování

   

   

Znaky a změna jejich velikosti

Vše

Kompilátory jazyka odpovídající specifikaci CLS musí dodržovat pravidla přílohy 7 z Technical Report 15 z Unicode Standardu 3.0, jimiž se řídí sada znaků, kterou lze spustit a zahrnout v identifikátorech. Tento standard je k dispozici na webové stránce Unicode Consortium.

Dva identifikátory, které mají být považovány za odlišné, se nemohou lišit jen velikostí písmen.

Klíčová slova

Kompilátory

Kompilátory jazyka odpovídající specifikaci CLS dodávají mechanismus pro odkazování identifikátorů, který se shoduje s klíčovými slovy. Kompilátory jazyka odpovídající specifikaci CLS poskytují mechanismus pro definování a přepsání virtuálních metod, jejichž názvy jsou klíčovými slovy v jazyce.

Jedinečnost

Všechny

Všechny názvy v rámci prostoru odpovídajícího specifikaci CLS musí být rozdílné, dokonce i když jde o názvy pro dva různé druhy členů, kromě případů, kdy jsou názvy shodné a jsou vyřešeny prostřednictvím přetížení. Například specifikace CLS neumožňuje, aby jeden typ používal stejný název pro metodu a položku.

Signatury

Všechny

Všechny návratové typy a typy parametrů objevující se v typu nebo v signatuře člena, musí odpovídat specifikaci CLS.

Typy

   

   

Primitivní typy

Vše

Knihovna tříd platformy .NET Framework zahrnuje typy, které odpovídají primitivním datovým typům, které používají kompilátory. Následující z těchto typů odpovídající specifikaci CLS: Byte, Int16, Int32, Int64, Single, Double, Boolean, Char, Decimal, IntPtr a String. Další informace o těchto typech naleznete v tabulce typů v Přehled knihovny tříd rozhraní .NET Framework.

Zabalené typy

Všechny

Zabalené hodnotové typy (hodnotové typy, které byly převedeny na objekty) nejsou součástí specifikace CLS. Místo toho podle potřeby použijte System.Object, System.ValueType nebo System.Enum.

Viditelnost

Všechny

Deklarace typu a člena nesmí obsahovat typy, které jsou méně viditelné nebo přístupné než typ nebo člen, který je deklarován.

Metody rozhraní

Kompilátory

Kompilátory jazyka odpovídající specifikaci CLS musí mít syntaxi pro situaci, kde jeden typ implementuje dvě rozhraní a každé z těchto rozhraní vyžaduje definici metody se stejným názvem a signaturou. Tyto metody musí být považovány za odlišné a nemusí mít stejnou implementaci.

Uzavření

Všechny

Jednotliví členové rozhraní odpovídajících specifikaci CLS a abstraktní třídy musí být definovány tak, aby odpovídali specifikaci CLS.

Volání konstruktoru

Všechny

Dříve než přistupuje k libovolným datům zděděné instance, musí konstruktor volat konstruktor základní třídy.

Typové odkazy

Všechny

Typové odkazy nejsou kompatibilní se specifikací CLS. (Typový odkaz je speciální konstrukce, která obsahuje odkaz na objekt a odkaz na typ. Typové odkazy umožňují modulu CLR (Common Language Runtime) poskytovat podporu (ve stylu jazyka C++) pro metody, které mají variabilní počet argumentů.)

Typy členů

   

   

Přetěžování

Vše

Indexované vlastnosti, metody a konstruktory mohou být přetížené, položky a události přetížené být nesmí.

Vlastnosti nesmí být přetíženy podle typu (to znamená, podle návratového typu jejich getter metody), ale mohou být přetíženy s různým počtem či typem indexů.

Metody mohou být přetíženy pouze na základě počtu a typu jejich parametrů a v případě obecných metod, na základě počtu jejich obecných parametrů.

Přetěžování operátoru není ve specifikaci CLS. Specifikace CLS však poskytuje návod pro stanovení užitečných názvů (například Add()) a nastavení bitu v metadatech. Kompilátory, které se rozhodnou podporovat přetěžování operátoru by měly dodržovat tyto pokyny, ale není to požadováno.

Jedinečnost přetížených členů

Všechny

Položky a vnořené typy musí být rozdílné už jen podle porovnání identifikátoru. Metody, vlastnosti a události, které mají stejný název (podle porovnání identifikátoru) se musí lišit více než jen návratovým typem.

Operátory konverze

Všechny

Pokud je přetížena metoda op_Implicit nebo op_Explicit vzhledem k návratovému typu, musí být poskytnut alternativní způsob poskytování konverze.

Metody

   

   

Přístupnost překrytých metod

Vše

Přístupnost nesmí být změněna při překrytí (přepsání) zděděných metod, s výjimkou překrytí metody zděděné z jiného sestavení s modifikátorem přístupu FamilyOrAssembly. V tomto případě musí mít přepsaná metoda přístupnost Family.

Seznam argumentů

Všechny

Jedinou konvencí volání, kterou podporuje specifikace CLS, je standardní konvence spravovaného volání; proměnná délka seznamů argumentů není povolena. (Použijte klíčové slovo ParamArray, v jazyce Microsoft Visual Basic a klíčové slovo params v jazyce C# pro podporu proměnného počtu argumentů.)

Vlastnosti

   

   

Metadata přistupujícího objektu

Kompilátory

Getter a setter metody, které implementují metody vlastností, jsou v metadatech označeny identifikátorem mdSpecialName.

Modifikátory

Všechny

Vlastnost a její přístupové objekty musí být všechny statické, virtuální nebo instanční.

Názvy přistupujícího objektu

Všechny

Vlastnosti musí dodržovat specifické vzory pojmenování. Pro vlastnost nazvanou Name bude getter metoda volána get_Name, pokud je definována setter metoda, tak bude volána set_Name.

Návratový typ a argumenty

Všechny

Typ vlastnosti je návratový typ getter metody a typ posledního argumentu setter metody. Typy parametrů vlastnosti jsou typy parametrů getter metody a typy všech kromě posledního parametru setter metody. Všechny tyto typy musí být kompatibilní se specifikací CLS a nemohou být spravovány ukazateli; nesmí být předávány odkazem.

Události

   

   

Metody události

Vše

Metody pro přidávání a odebírání události musí být obě buď přítomné nebo chybět.

Metadata metody události

Kompilátory

Metody, které implementují událost musí být v metadatech označeny identifikátorem mdSpecialName .

Přístupnost přistupujícího objektu

Všechny

Přístupnost metod pro přidávání, odebírání a vyvolávání události musí být identická.

Modifikátory

Všechny

Metody pro přidávání, odebírání a vyvolávání události musí být všechny statické, virtuální nebo instanční.

Názvy metod událostí

Všechny

Události musí dodržovat specifické vzory pojmenování. Pro událost pojmenovanou MyEvent má mít metoda pro přidání, pokud je definována, název add_MyEvent, metoda pro odebrání, jestliže je definována, bude pojmenována remove_MyEvent a metoda pro vyvolání bude mít název raise_MyEvent.

Argumenty

Všechny

Metody pro přidávání a odebírání události musí každá vzít jeden parametr, jehož typ určuje typ události a tento typ musí být odvozen od System.Delegate.

Typy ukazatelů

   

   

Ukazatele

Vše

Typy ukazatelů a typy ukazatelů na funkci nejsou kompatibilní se specifikací CLS.

Rozhraní

   

   

Signatury členů

Vše

Rozhraní odpovídající specifikaci CLS nesmí vyžadovat definici metod, které neodpovídají specifikaci CLS za účelem jejich implementace.

Modifikátory členů

Všechny

Rozhraní odpovídající specifikaci CLS nemohou definovat statické metody a také položky. Mohou definovat vlastnosti, události a virtuální metody.

Odkazové typy

   

   

Volání konstruktoru

Vše

Pro odkazové typy jsou konstruktory volány pouze jako část vytvoření objektu. Objekty jsou inicializovány pouze jednou.

Typy tříd

   

   

Dědičnost

Vše

Třída odpovídající specifikaci CLS musí dědit z třídy odpovídající specifikaci CLS (System.Object odpovídá specifikaci CLS).

Pole1

   

   

Typy prvků

Vše

Prvky pole musí být typu, který odpovídá specifikaci CLS.

Dimenze

Vše

Pole musí mít pevný počet rozměrů, které jsou větší než nula.

Hranice

Vše

Všechny dimenze pole musí mít první prvek s indexem 0.

Výčty

   

   

Nadřazený typ

Vše

Nadřazený typ výčtu musí být vestavěný celočíselný typ (Byte, Int16, Int32 nebo Int64).

Atribut příznaků

Kompilátory

Přítomnost vlastního atributu System.FlagsAttribute v definici výčtu označuje, že výčet by měl být považován za sadu bitových příznaků (flags) a absence tohoto atributu označuje, že typ by měl být chápán jako skupina vypočítaných konstant. Doporučuje se, aby jazyky používaly buď FlagsAttribute nebo určitou specifickou syntaxi pro daný jazyk, aby rozlišili, o který typ výčtu se jedná.

Členské položky

Všechny

Statické položky (prvky) výčtu musí být stejného typu jako daný výčet.

Výjimky

   

   

Dědičnost

Vše

Objekty, které jsou vyvolány musí být typu System.Exception nebo dědit z System.Exception.

Vlastní atributy

   

   

Kódování hodnot

Kompilátory

Kompilátory odpovídající specifikaci CLS, musí zacházet pouze s podmnožinou kódování vlastních atributů (reprezentace vlastních atributů v metadatech). Jediné typy, které jsou povoleny v těchto kódováních: System.Type, System.String, System.Char, System.Boolean, System.Byte, System.Int16, System.Int32, System.Int64, System.Single, System.Double a jakýkoli typ výčtu založený na typu základního celého čísla kompatibilním se specifikací CLS.

Metadata

   

   

Kompatibilita se specifikací CLS

Vše

Typy, jejichž kompatibilita se specifikací CLS se liší od kompatibility sestavení, ve kterém jsou definovány musí být označeny pomocí atributu System.CLSCompliantAttribute. Podobně musí být označeny také členy, jejichž kompatibilita se specifikací CLS se liší od kompatibility jejich typu. Pokud je člen nebo typ označen jako neodpovídající specifikaci CLS, musí být poskytnuta alternativa, která odpovídá specifikaci CLS.

Obecné typy

Názvy typu

Kompilátory

Název obecného typu musí kódovat počet parametrů typu, který je u typu deklarován. Název vnořeného obecného typu musí kódovat počet nově zavedených parametrů typu.

Vnořené typy

Kompilátory

Vnořené typy musí mít alespoň tolik obecných parametrů jako nadřazený typ. Obecné parametry ve vnořených typech odpovídají podle pozice obecným parametrům v jejich nadřazeném typu.

Omezení

Všechny

Obecný typ musí deklarovat dostatečná omezení, aby zaručil, že jakákoliv omezení u základního typu nebo rozhraní jsou splněna díky jeho omezením.

Typy omezení

Všechny

Typy použité jako omezení u obecných parametrů musí samy odpovídat specifikaci CLS.

Signatury členů

Všechny

Viditelnost a přístupnost členů (včetně vnořených typů) v instanci obecného typu je považována za vymezenou pro konkrétní instanci spíše než deklarace obecného typu jako celku.

Obecné metody

Všechny

Pro každou abstraktní nebo virtuální obecnou metodu musí existovat výchozí, konkrétní (ne abstraktní) implementace.

1. Vícenásobná pole – to jsou pole polí – odpovídají specifikaci CLS. V rozhraní .NET Framework verze 1.0 kompilátor jazyka C# omylem ohlásí, že nejsou.

Viz také

Koncepty

Vzájemná funkční spolupráce mezi jazyky