Co to jest atrybut „CLSCompliant” w .NET?

Odpowiedzi:

181

Oznaczasz klasy CLSCompliantatrybutem, jeśli chcesz mieć pewność, że będzie on mógł być używany przez dowolny inny język .NET.
Oto podstawowe zasady:

  1. Typy bez znaku nie powinny być częścią publicznego interfejsu klasy. Oznacza to, że pola publiczne nie powinny mieć typów bez znaku, takich jak uintlub ulong, metody publiczne nie powinny zwracać typów bez znaku, parametry przekazywane do funkcji publicznej nie powinny mieć typów bez znaku. Jednak niepodpisane typy mogą być częścią prywatnych członków.

  2. Nie należy używać niebezpiecznych typów, takich jak wskaźniki, z publicelementami składowymi. Jednak mogą być używane z privateczłonkami.

  3. Nazwy klas i nazwy członków nie powinny różnić się tylko wielkością liter. Na przykład nie możemy mieć dwóch metod nazwanych MyMethodi MYMETHOD.

  4. Przeciążane mogą być tylko właściwości i metody, operatory nie powinny być przeciążane.

Otávio Décio
źródło
Czy zrobiłbyś to domyślnie dla każdego projektu?
Naeem Sarfraz,
3
Niekoniecznie, głównie dla tych, którzy mogą mieć kontakt z innymi językami .net.
Otávio Décio
1
Kolejnym ograniczeniem jest CS3006: Przeciążona metoda `` Foo.Bar (ref Baz) '' różniąca się tylko ref, out lub rankingiem tablicy nie jest zgodna z CLS
Drew Noakes
Jeszcze jedno: publiczne identyfikatory nie powinny zaczynać się od znaku podkreślenia.
Crono
44

Informuje innych konsumentów o Twoim kodzie, że jest zgodny z CLS , a także sprawia, że ​​kompilator C # sprawdza , czy jest zgodny z CLS.

Przywoływany artykuł zawiera dużo więcej szczegółów na temat zgodności z CLS.

Jon Skeet
źródło
12
Jeśli więc dodam atrybut, a następnie skompiluję projekt bez reklamacji, oznacza to, że mój projekt jest zgodny z CLS i wszystko jest w porządku?
Svish
@Svish, tak, o to chodzi. Kompilator poinformuje Cię, jeśli naruszysz jakiekolwiek zasady.
Drew Noakes,
41

Pozostałe odpowiedzi są prawidłowe. Pozwól, że wyjaśnię kilka rzeczy - CLS to skrót od Common Language Specification. Jest to minimalny zestaw reguł i wymaganych funkcji językowych, które język .NET musi implementować i rozumieć. Ten zestaw jest podzbiorem wspólnego systemu typów , który definiuje sposób definiowania typów w .NET.

Zgodność z CLS oznacza, że ​​można pisać kod, który może być używany przez dowolny język, który można skompilować i uruchomić w środowisku CLR. Jednak zgodność z CLS nie jest wymagana, co zapewnia elastyczność w przypadkach, gdy zgodność z CLS byłaby trudna lub niemożliwa do wykonania.

Jeśli zamierzasz używać swojego kodu przez innych programistów, Twój interfejs API (Twoje publiczne klasy i metody) powinien być zgodny z CLS. Należy to zadeklarować, dodając CLSCompliantAttribute do swoich zestawów. Jeśli nie piszesz dla innych, zgodność z CLS nie jest konieczna, chociaż FxCop ( Framework Cop) by się ze mną nie zgodził.

Gdy zestaw jest oznaczony atrybutem CLSCompliantAttribute, kompilator (powinien!) Sprawdzi Twój kod, aby sprawdzić, czy po skompilowaniu naruszy on którąkolwiek z reguł CLS (z których część wspomniano w ocdecio ) i zgłosi naruszenia w celu naprawienia.

Peter Mortensen
źródło
FxCop mnie tu przywiózł.
Teoman shipahi
Niestety wielka wizja CLR mającego wiele różnych języków frontendowych (takich jak VB.NET - który umiera powolną śmiercią - i inne teraz zniknęły, jak MC ++, Delphi.NET, Oxygene, J #, JScript.NET i tak dalej) ogranicza korzyści z ukończenia zgodności z CLSC, biorąc pod uwagę, że inne języki, które obsługują CLR, nie mają problemu z obsługą funkcji niezgodnych z CLS, takich jak opcjonalne parametry i outparametry - więc myślę, że Microsoft musi zrewidować wymagania CLS i być może je poluzować.
Dai
13

Zgodność z CLS to podzbiór pełnego spektrum języków dozwolonych przez CLR. Ogranicza to do podzbiorów, które są prawdopodobnie dostępne w większości języków, które są przeznaczone dla CLR. Zwiększa to, ale nie gwarantuje, że Twoja biblioteka może być używana we wszystkich językach przeznaczonych dla środowiska CLR.

JaredPar
źródło
8

Jak tu pasuje: Aby oznaczyć cały projekt jako zgodny z CLS, dodaj tę linię do AssemblyInfo.cs(można znaleźć w sekcji Właściwości w Eksploratorze rozwiązań)

[assembly:CLSCompliant(true)]

lub równoważnie w VB.NET ( AssemblyInfo.vbjest ukryty pod My Project)

<Assembly: CLSCompliant(True)>

Dziękujemy za zapewnienie zgodności kodu z CLS .

Markus Hartmair
źródło