Apa atribut 'CLSCompliant' di .NET?

Jawaban:

181

Anda menandai kelas dengan CLSCompliantatribut ketika Anda ingin memastikan itu dapat digunakan oleh bahasa .NET lainnya.
Ini adalah aturan dasar:

  1. Tipe yang tidak ditandai tidak boleh menjadi bagian dari antarmuka publik kelas. Artinya, bidang publik tidak boleh memiliki tipe unsigned seperti uintatau ulong, metode publik tidak boleh mengembalikan tipe unsigned, parameter yang diteruskan ke fungsi publik seharusnya tidak memiliki tipe unsigned. Namun tipe yang tidak ditandatangani dapat menjadi bagian dari anggota pribadi.

  2. Jenis yang tidak aman seperti pointer tidak boleh digunakan dengan publicanggota. Namun mereka dapat digunakan dengan privateanggota.

  3. Nama kelas dan nama anggota tidak boleh berbeda hanya berdasarkan kasusnya. Sebagai contoh, kita tidak dapat memiliki dua metode bernama MyMethoddan MYMETHOD.

  4. Hanya properti dan metode yang kelebihan beban, operator tidak boleh kelebihan beban.

Otávio Décio
sumber
Apakah Anda akan melakukannya sebagai default untuk setiap proyek?
Naeem Sarfraz
3
Tidak harus, sebagian besar untuk mereka yang mungkin memiliki eksposur ke bahasa .net lainnya.
Otávio Décio
1
Pembatasan lain adalah CS3006: Metode kelebihan beban 'Foo.Bar (ref Baz)' hanya berbeda dalam ref atau out, atau dalam peringkat array, tidak sesuai dengan CLS
Drew Noakes
Satu lagi: pengidentifikasi publik tidak boleh dimulai dengan karakter garis bawah.
Crono
44

Ini memberi tahu konsumen lain tentang kode Anda bahwa itu adalah CLS compliant , dan juga membuat C # compiler memeriksa apakah CLS compliant untuk Anda.

Artikel yang dirujuk berisi lebih banyak detail tentang apa yang menuntut kepatuhan CLS.

Jon Skeet
sumber
12
Jadi jika saya menambahkan atribut dan kemudian membangun proyek saya tanpa keluhan, itu berarti proyek saya sesuai dengan CLS dan semuanya baik-baik saja?
Svish
@Vish, ya itu masalahnya. Kompiler akan memberi tahu Anda jika Anda melanggar aturan apa pun.
Drew Noakes
41

Jawaban lainnya benar. Izinkan saya mengklarifikasi beberapa hal - CLS adalah singkatan dari Common Language Spesifikasi. Ini adalah sekumpulan aturan minimum dan fitur bahasa yang diperlukan yang harus diterapkan dan dipahami oleh bahasa .NET. Set ini adalah subset dari sistem tipe umum , yang mendefinisikan bagaimana tipe didefinisikan dalam .NET.

Menjadi CLS compliant berarti Anda dapat menulis kode yang dapat dikonsumsi oleh bahasa apa pun yang dapat dikompilasi dan dijalankan di CLR. Tetapi kepatuhan CLS tidak diperlukan, memberi Anda fleksibilitas dalam kasus di mana kepatuhan CLS akan sulit atau tidak mungkin dilakukan.

Jika Anda ingin kode Anda dikonsumsi oleh pengembang lain, API Anda (kelas dan metode publik Anda) harus sesuai dengan CLS. Anda harus mendeklarasikan ini dengan menambahkan CLSCompliantAttribute ke majelis Anda. Jika Anda tidak menulis untuk orang lain, kepatuhan CLS tidak diperlukan, meskipun FxCop ( Framework Cop) akan tidak setuju dengan saya.

Ketika perakitan Anda ditandai dengan CLSCompliantAttribute, kompiler akan (harus!) Memeriksa kode Anda untuk melihat apakah, ketika dikompilasi, itu akan melanggar salah satu aturan CLS (beberapa yang disebutkan ocdecio ) dan melaporkan pelanggaran kepada Anda untuk memperbaikinya.

Peter Mortensen
sumber
FxCop membawaku ke sini.
Teoman shipahi
Sayangnya grand-vision CLR memiliki banyak bahasa frontend yang berbeda (seperti VB.NET - yang sekarat karena kematian lambat - dan yang lainnya sekarang hilang, seperti MC ++, Delphi.NET, Oxygene, J #, JScript.NET, dan sebagainya) membatasi manfaat menyelesaikan CLSCompliance mengingat bahwa bahasa lain yang tersisa yang mendukung CLR tidak memiliki masalah mendukung fitur yang tidak CLSCompliant seperti parameter dan parameter opsional out- jadi saya pikir Microsoft perlu meninjau kembali persyaratan CLS dan mungkin melonggarkannya.
Dai
13

CLS compliant adalah bagian dari spektrum bahasa lengkap yang diizinkan oleh CLR. Itu membatasi untuk himpunan bagian yang mungkin tersedia oleh sebagian besar bahasa yang menargetkan CLR. Ini meningkat, tetapi tidak menjamin, bahwa perpustakaan Anda dapat digunakan oleh semua bahasa yang menargetkan CLR.

JaredPar
sumber
8

Sesuai di sini: Untuk menandai seluruh proyek yang memenuhi CLS tambahkan baris ini ke AssemblyInfo.cs(dapat ditemukan di bawah Properties di Solution Explorer)

[assembly:CLSCompliant(true)]

atau setara di VB.NET ( AssemblyInfo.vbdisembunyikan di bawah Proyek Saya)

<Assembly: CLSCompliant(True)>

Berkat Membuat Kode Anda Sesuai CLS .

Markus Hartmair
sumber