.NET'te 'CLSCompliant' özniteliği nedir?


Yanıtlar:


181

CLSCompliantBaşka bir .NET dili tarafından kullanılabildiğinden emin olmak istediğinizde sınıfları öznitelikle işaretlersiniz .
Bunlar temel kurallardır:

  1. İmzasız türler, sınıfın genel arabiriminin bir parçası olmamalıdır. Bunun anlamı, kamusal alanların işaretsiz türlere sahip olmaması uintveya ulongkamusal yöntemlerin işaretsiz türler döndürmemesi, kamusal işleve geçirilen parametrelerin işaretsiz türlere sahip olmamasıdır. Ancak imzasız tipler özel üyelerin bir parçası olabilir.

  2. Gibi Güvensiz tipleri işaretçiler ile kullanılmamalıdır publicüyeleri. Ancak privateüyelerle birlikte kullanılabilir .

  3. Sınıf adları ve üye adları yalnızca durumlarına göre farklılık göstermemelidir. Örneğin MyMethodve adında iki yöntemimiz olamaz MYMETHOD.

  4. Yalnızca özellikler ve yöntemler aşırı yüklenebilir, operatörler aşırı yüklenmemelidir.


Bunu her proje için varsayılan olarak yapar mısın?
Naeem Sarfraz

3
Çoğunlukla diğer .net dillerine maruz kalabilecek olanlar için gerekli değildir.
Otávio Décio

1
Başka bir kısıtlama CS3006: Sadece ref veya out veya dizi sıralamasında farklılık gösteren aşırı yüklenmiş 'Foo.Bar (ref Baz) yöntemi CLS uyumlu değil
Drew Noakes

Bir tane daha: genel tanımlayıcılar alt çizgi karakteriyle başlamamalıdır.
Crono

44

Kodunuzun diğer tüketicilerine CLS uyumlu olduğunu söyler ve ayrıca C # derleyicisinin sizin için CLS uyumlu olup olmadığını kontrol etmesini sağlar.

Atıfta bulunulan makale, CLS uyumluluğunun neyi içerdiği hakkında çok daha fazla ayrıntı içermektedir.


12
Eğer özniteliği ekler ve sonra herhangi bir şikayeti olmadan projemi inşa edersem, projem CLS uyumlu ve her şey iyi mi demektir?
Svish

@Vish, evet durum böyle. Derleyici, herhangi bir kuralı ihlal edip etmediğinizi size bildirir.
Drew Noakes

41

Diğer cevaplar doğrudur. Bazı şeyleri açıklığa kavuşturayım - CLS, Ortak Dil Spesifikasyonu anlamına gelir. Bir .NET dilinin uygulaması ve anlaması gereken minimum kurallar ve gerekli dil özellikleri kümesidir. Bu küme, .NET'te türlerin nasıl tanımlandığını tanımlayan ortak tür sisteminin bir alt kümesidir .

CLS uyumlu olmak, CLR'de derlenip çalıştırılabilen herhangi bir dil tarafından tüketilebilecek kod yazabileceğiniz anlamına gelir. Ancak CLS uyumluluğuna gerek yoktur, bu nedenle CLS uyumluluğunun zor veya imkansız olduğu durumlarda esneklik sağlar.

Kodunuzu diğer geliştiriciler tarafından tüketilmek istiyorsanız, API'nız (genel sınıflarınız ve yöntemleriniz) CLS uyumlu olmalıdır. Derlemelerinize CLSCompliantAttribute ekleyerek bunu bildirmelisiniz. Başkaları için yazmıyorsanız, FxCop ( Framework Cop) benimle aynı fikirde olmasa da CLS uyumluluğu gerekli değildir .

Derlemeniz CLSCompliantAttribute ile işaretlendiğinde, derleyici, derlendiğinde CLS kurallarından herhangi birini ( ocdecio'nun bahsettiği) ihlal edip etmediğini ve düzeltmek için ihlalleri bildirip bildirmeyeceğini görmek için kodunuzu kontrol etmelidir (yapmalıdır!) .


FxCop beni buraya getirdi.
Teoman shipahi

Ne yazık ki CLR'nin birçok farklı ön uç dili (yavaş bir ölümle ölen VB.NET gibi) ve şimdi MC ++, Delphi.NET, Oxygene, J #, JScript.NET ve benzeri gibi gitmiş olan büyük vizyon sınırları CLR'yi destekleyen diğer kalan dillerin isteğe bağlı parametreler ve outparametreler gibi CLSCompliant özelliklerini destekleme konusunda hiçbir sorunu olmadığı göz önüne alındığında CLSCompliance'ı tamamlamanın faydaları - bu yüzden Microsoft'un CLS gereksinimlerini tekrar gözden geçirmesi ve belki de gevşetmesi gerektiğini düşünüyorum.
Dai

13

CLS uyumlu, CLR tarafından izin verilen tam dil spektrumunun bir alt kümesidir. CLR'yi hedefleyen dillerin çoğunluğu tarafından kullanılabilen alt kümelerle sınırlar. Bu, kütüphanenizin CLR'yi hedefleyen tüm diller tarafından kullanılabileceğini artırır ancak garanti etmez.


8

Buraya sığdığı gibi: CLS uyumlu bir projenin tamamını işaretlemek için bu satırı ekleyin AssemblyInfo.cs(Solution Explorer'da Özellikler altında bulunabilir)

[assembly:CLSCompliant(true)]

veya eşdeğer olarak VB.NET'te ( AssemblyInfo.vbProjem altında gizlidir)

<Assembly: CLSCompliant(True)>

Kodunuzu CLS Uyumlu Yaptığınız için Teşekkürler .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.