Zápis kódu odpovídajícího specifikaci CLS
Dodržování předpisů specifikace CLS (Common Language Specification) obecně odkazuje na tvrzení, že pravidla a omezení specifikace CLS jsou dodržovány. Nicméně tento koncept má však specifičtější význam v závislosti na tom, zda popisujete kód odpovídající specifikaci CLS nebo vývojové nástroje odpovídající specifikaci CLS, jako je například kompilátor. Nástroje odpovídající specifikaci CLS vám mohou pomoci psát kód odpovídající specifikaci CLS.
Kód odpovídající specifikaci CLS
Pokud chcete, aby váš kód odpovídal specifikaci CLS, je nutné zveřejnit funkčnost takovým způsobem, aby odpovídala specifikaci CLS v následujících oblastech:
Definice vašich veřejných tříd.
Definice veřejných členů náležících veřejným třídám a členů schopných přistupovat k odvozeným třídám (family přístup).
Parametry a návratové typy veřejných metod náležících veřejným třídám a metod, které jsou schopné přistupovat k odvozeným třídám.
Vlastnosti, které používáte v definicích soukromých tříd, v definicích soukromých metod ve veřejných třídách a v lokálních proměnných nemusí splňovat pravidla specifikace CLS. Můžete také použít jakékoliv vlastnosti jazyka, které chcete v kódu, který implementuje vaši třídu a stále budete mít komponentu kompatibilní se specifikací CLS.
Poznámka |
---|
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. |
Pomocí CLSCompliantAttribute můžete označit sestavení, moduly, typy a členy jako odpovídající specifikaci CLS nebo neodpovídající specifikaci CLS. Všechna sestavení, která jsou určena k tomu, aby odpovídala specifikaci CLS by tak měla být označena. Sestavení, které není označeno jako odpovídající specifikaci CLS je považováno za neodpovídající specifikaci CLS. Pokud žádný atribut specifikace CLS není aplikován u typu, tak se předpokládá, že tento typ má stejnou kompatibilitu se specifikací CLS jako sestavení, ve kterém je definován. Podobně pokud žádný atribut specifikace CLS není aplikován u člena, tak se u tohoto členu předpokládá stejná kompatibilita se specifikací CLS jako u typu, který ho definuje. Nemůžete označit prvek programu jako odpovídající specifikaci CLS pokud jeho ohrazující prvek není označen jako odpovídající specifikaci CLS. Příklad na konci tohoto tématu ilustruje použití CLSCompliantAttribute.
Sestavení, moduly a typy mohou být odpovídající specifikaci CLS i v případě, že některé části sestavení, modulu nebo typu neodpovídají specifikaci CLS, pokud jsou splněny dvě podmínky:
Pokud je prvek označen jako odpovídající specifikaci CLS, pak je nutné aby části, které neodpovídají specifikaci CLS byly označeny pomocí CLSCompliantAttribute s argumentem nastaveným na false.
Srovnatelný alternativní člen odpovídající specifikaci CLS musí být dodán pro každého člena, který neodpovídá specifikaci CLS.
Pokud navrhujete knihovnu tříd odpovídající specifikaci CLS, tak vaše knihovny budou mít zaručenou vzájemnou funkční spolupráci s širokým spektrem programovacích jazyků; proto by vaše knihovna mohla mít širší zákaznickou základnu než verze, která není kompatibilní se specifikaci CLS.
Rozhraní .NET Framework poskytuje knihovnu tříd odpovídající specifikaci CLS. Další informace o této knihovně tříd naleznete v .NET Framework Class Library.
Nástroje odpovídající specifikaci CLS
Jazyky, které se zaměřují na modul runtime, se dohodly podporovat vlastnosti specifikace CLS a dodržování pravidel CLS směřovat na kompilátory. Tyto kompilátory jazyka zjednodušují kompatibilitu se specifikací CLS tím, že vytváří datové typy a vlastnosti specifikace CLS dostupné pro vytváření komponent. Úrovně kompatibility se specifikací CLS mezi kompilátory a jinými nástroji jsou popsány takto:
Zákaznické nástroje odpovídající specifikaci CLS.
Zákaznické nástroje jsou jazyky, které umožňují vývojářům získat přístup ke všem vlastnostem poskytnutým knihovnami, které odpovídají specifikaci CLS. Vývojáři používající tyto jazyky možná nebudou moci rozšířit knihovny odpovídající specifikaci CLS pomocí vytvoření nových typů, ale mohou použít libovolný typ definovaný odpovídající knihovnou. Tento stupeň kompatibility může být užitečný, když chcete přistupovat ke knihovně tříd rozhraní .NET Framework, ale nemusíte vytvořit nové objekty pro spotřebu jinými uživateli, například když používáte Webové formuláře na ASP.NET stránce nebo vytváříte uživatelské rozhraní modelu Windows Forms.
Rozšiřující nástroje odpovídající specifikaci CLS.
Nadstavbové nástroje jsou jazyky, které umožňují vývojářům použít i rozšířit typy definované v knihovnách odpovídajících specifikaci CLS. Vývojáři mohou použít existující typy právě tak jako definovat nové typy. Nadstavbové nástroje musí splňovat všechna pravidla, která musí splňovat zákaznické nástroje i některá další pravidla, která jsou popsána ve specifikaci pro společnou jazykovou infrastrukturu, oddíl I - Architektura, která je k dispozici na webu Microsoft Developer Network (MSDN).
Při návrhu vlastních komponent odpovídajících specifikaci CLS je užitečné použít nástroj odpovídající specifikaci CLS. Psaní komponent odpovídajících specifikaci CLS bez této podpory je obtížnější, protože v opačném případě je možné, že nemáte přístup ke všem vlastnostem specifikace CLS, které chcete použít.
Některé kompilátory odpovídající specifikaci CLS, jako jsou například kompilátory jazyka C# nebo Visual Basic vám umožní specifikovat, že máte v úmyslu, aby váš kód odpovídal specifikaci CLS. Tyto kompilátory mohou kontrolovat kompatibilitu se specifikací CLS a dají vám vědět, kdy váš kód používá funkčnost, která není podporována specifikací CLS. Kompilátory jazyka C# a Visual Basic vám umožňují označit element programu jako odpovídající specifikaci CLS, což způsobí, že kompilátor bude generovat chybu v době kompilace, pokud kód nebude odpovídat specifikaci CLS. Například následující kód vygeneruje upozornění kompilátoru.
<Assembly: CLSCompliant(True)>
<CLSCompliant(True)> Public Class MyCompliantClass
Public Sub ChangeValue(value As UInt32)
End Sub
Public Shared Sub Main()
Dim i As Integer = 2
Console.WriteLine(i)
End Sub
End Class
using System;
// Assembly marked as compliant.
[assembly: CLSCompliant(true)]
// Class marked as compliant.
[CLSCompliant(true)]
public class MyCompliantClass {
// ChangeValue exposes UInt32, which is not in CLS.
// A compile-time warning results.
public void ChangeValue(UInt32 value){ }
public static void Main( ) {
int i = 2;
Console.WriteLine(i);
}
}
Tento kód generuje následující C# upozornění:
warning CS3001: Argument type 'uint' is not CLS-compliant
nebo následující upozornění Visual Basicu:
warning BC40028: Type of parameter 'value' is not CLS-compliant.
Pro odebrání upozornění můžete určit, že ChangeValue není kompatibilní, jak je znázorněno v následujícím příkladu.
' Assembly marked as compliant.
<Assembly: CLSCompliant(True)>
' Class marked as compliant.
<CLSCompliant(True)> Public Class MyCompliantClass
' Method marked as not compliant.
<CLSCompliant(False)> Public Sub ChangeValue(value As UInt32)
End Sub
Public Shared Sub Main()
Dim i As Integer = 2
Console.WriteLine(i)
End Sub
End Class
using System;
// Assembly marked as compliant.
[assembly: CLSCompliantAttribute(true)]
// Class marked as compliant.
[CLSCompliantAttribute(true)]
public class MyCompliantClass {
// Method marked as not compliant.
[CLSCompliantAttribute(false)]
public void ChangeValue(UInt32 value){ }
public static void Main( ) {
int i = 2;
Console.WriteLine(i);
}
}
Tento kód nevytvoří žádné upozornění kompilátoru. Výstup je 2.
Další informace o tom, jak specifikovat kompatibilitu vašeho kódu se specifikací CLS naleznete v dokumentaci pro kompilátor jazyka, který používáte.