Was ist das Attribut 'CLSCompliant' in .NET?

Antworten:

181

Sie markieren Klassen mit dem CLSCompliantAttribut, wenn Sie sicherstellen möchten, dass es von jeder anderen .NET-Sprache verwendet werden kann.
Dies sind die Grundregeln:

  1. Vorzeichenlose Typen sollten nicht Teil der öffentlichen Schnittstelle der Klasse sein. Dies bedeutet, dass öffentliche Felder keine vorzeichenlosen Typen wie uintoder haben ulongsollten. Öffentliche Methoden sollten keine vorzeichenlosen Typen zurückgeben. Parameter, die an die öffentliche Funktion übergeben werden, sollten keine vorzeichenlosen Typen haben. Nicht signierte Typen können jedoch Teil privater Mitglieder sein.

  2. Unsichere Typen wie Zeiger sollten nicht mit publicMitgliedern verwendet werden. Sie können jedoch mit privateMitgliedern verwendet werden.

  3. Klassennamen und Mitgliedsnamen sollten sich nicht nur aufgrund ihres Falls unterscheiden. Zum Beispiel können wir nicht zwei Methoden mit dem Namen MyMethodund haben MYMETHOD.

  4. Es dürfen nur Eigenschaften und Methoden überladen werden, Operatoren sollten nicht überladen werden.

Otávio Décio
quelle
Würden Sie das standardmäßig für jedes Projekt tun?
Naeem Sarfraz
3
Nicht unbedingt, vor allem für diejenigen, die möglicherweise Kontakt zu anderen .net-Sprachen haben.
Otávio Décio
1
Eine weitere Einschränkung ist CS3006: Die überladene Methode 'Foo.Bar (ref Baz)', die sich nur in ref oder out oder im Array-Rang unterscheidet, ist nicht CLS-konform
Drew Noakes
Eins noch: Öffentliche Bezeichner sollten nicht mit einem Unterstrich beginnen.
Crono
44

Es teilt anderen Verbrauchern Ihres Codes mit, dass er CLS-kompatibel ist , und lässt den C # -Compiler überprüfen, ob er für Sie CLS-kompatibel ist.

Der Artikel, auf den verwiesen wird, enthält viel detailliertere Informationen zur CLS-Konformität.

Jon Skeet
quelle
12
Wenn ich also das Attribut hinzufüge und dann mein Projekt ohne Beschwerden erstelle, bedeutet dies, dass mein Projekt CLS-konform ist und alles in Ordnung ist?
Svish
@Svish, ja das ist der Fall. Der Compiler informiert Sie, wenn Sie gegen Regeln verstoßen.
Drew Noakes
41

Die anderen Antworten sind richtig. Lassen Sie mich einige Dinge klarstellen - CLS steht für die Common Language Specification. Dies sind die minimalen Regeln und erforderlichen Sprachfunktionen, die eine .NET-Sprache implementieren und verstehen muss. Diese Menge ist eine Teilmenge des allgemeinen Typsystems , das definiert, wie Typen in .NET definiert werden.

CLS-konform zu sein bedeutet, dass Sie Code schreiben können, der von jeder Sprache verwendet werden kann, die kompiliert und auf der CLR ausgeführt werden kann. Eine CLS-Konformität ist jedoch nicht erforderlich, sodass Sie die Flexibilität in Fällen erhalten, in denen eine CLS-Konformität schwierig oder unmöglich wäre.

Wenn Sie beabsichtigen, Ihren Code von anderen Entwicklern zu verwenden, sollte Ihre API (Ihre öffentlichen Klassen und Methoden) CLS-kompatibel sein. Sie sollten dies deklarieren, indem Sie Ihren Assemblys das CLSCompliantAttribute hinzufügen. Wenn Sie nicht für andere schreiben, ist die CLS-Konformität nicht erforderlich, obwohl FxCop ( Framework Cop) mir nicht zustimmen würde.

Wenn Ihre Assembly mit dem CLSCompliantAttribute markiert ist, überprüft (sollte!) Ihr Compiler Ihren Code, um festzustellen, ob er beim Kompilieren gegen eine der CLS-Regeln verstößt (von denen einige) ocdecio erwähnt wurden), und meldet Ihnen Verstöße zur Behebung.

Peter Mortensen
quelle
FxCop hat mich hierher gebracht.
Teoman Shipahi
Leider ist die großartige Vision der CLR mit vielen verschiedenen Frontend-Sprachen (wie VB.NET - das einen langsamen Tod erleidet - und anderen, wie MC ++, Delphi.NET, Oxygene, J #, JScript.NET usw.) begrenzt Die Vorteile des Abschlusses von CLSCompliance angesichts der Tatsache, dass die anderen verbleibenden Sprachen, die die CLR unterstützen, keine Probleme haben, nicht CLSCompliant-Funktionen wie optionale Parameter und outParameter zu unterstützen. Daher denke ich, dass Microsoft die Anforderungen des CLS erneut prüfen und möglicherweise lockern muss.
Dai
13

CLS-konform ist eine Teilmenge des gesamten Sprachspektrums, das von der CLR zugelassen wird. Es beschränkt sich auf Teilmengen, die wahrscheinlich von den meisten Sprachen verfügbar sind, die auf die CLR abzielen. Dies erhöht, garantiert jedoch nicht, dass Ihre Bibliothek von allen Sprachen verwendet werden kann, die auf die CLR abzielen.

JaredPar
quelle
8

So passt es hierher: Um ein ganzes Projekt als CLS-konform zu markieren, fügen Sie diese Zeile hinzu AssemblyInfo.cs(finden Sie unter Eigenschaften im Projektmappen- Explorer).

[assembly:CLSCompliant(true)]

oder gleichwertig in VB.NET ( AssemblyInfo.vbist unter Mein Projekt versteckt)

<Assembly: CLSCompliant(True)>

Dank der CLS-Konformität Ihres Codes .

Markus Hartmair
quelle