แอตทริบิวต์ 'CLSCompliant' ใน .NET คืออะไร


คำตอบ:


181

คุณทำเครื่องหมายคลาสที่มีแอCLSCompliantททริบิวต์เมื่อคุณต้องการตรวจสอบให้แน่ใจว่าสามารถใช้งานได้กับภาษา. NET อื่น ๆ
นี่คือกฎพื้นฐาน:

  1. ประเภทที่ไม่ได้ลงนามไม่ควรเป็นส่วนหนึ่งของส่วนต่อประสานสาธารณะของชั้นเรียน สิ่งนี้หมายความว่าอะไรเขตข้อมูลสาธารณะไม่ควรมีประเภทที่ไม่ได้ลงนามเช่นuintหรือulongวิธีการสาธารณะไม่ควรส่งคืนประเภทที่ไม่ได้ลงนามพารามิเตอร์ที่ส่งผ่านไปยังฟังก์ชันสาธารณะไม่ควรมีประเภทที่ไม่ได้ลงนาม อย่างไรก็ตามประเภทที่ไม่ได้ลงนามสามารถเป็นส่วนหนึ่งของสมาชิกส่วนตัว

  2. ประเภทที่ไม่ปลอดภัยเช่นพอยน์เตอร์ไม่ควรใช้กับpublicสมาชิก อย่างไรก็ตามพวกเขาสามารถใช้กับprivateสมาชิก

  3. ชื่อคลาสและชื่อสมาชิกไม่ควรแตกต่างกันตามกรณีของพวกเขา ตัวอย่างเช่นเราไม่สามารถมีสองวิธีการตั้งชื่อและMyMethodMYMETHOD

  4. คุณสมบัติและเมธอดเท่านั้นที่สามารถโอเวอร์โหลดได้ผู้ประกอบการไม่ควรโอเวอร์โหลด


คุณจะทำเช่นนั้นเป็นค่าเริ่มต้นสำหรับทุกโครงการหรือไม่
Naeem Sarfraz

3
ไม่จำเป็นต้องเป็นส่วนใหญ่สำหรับผู้ที่อาจมีการเปิดรับภาษาอื่น ๆ สุทธิ
OtávioDécio

1
ข้อ จำกัด อีกอย่างคือCS3006: วิธีการโอเวอร์โหลด 'Foo.Bar (ref Baz)' แตกต่างกันเฉพาะในการอ้างอิงหรือออกหรือในลำดับแถวไม่สอดคล้องกับ CLS
Drew Noakes

อีกหนึ่งตัวระบุสาธารณะไม่ควรเริ่มต้นด้วยอักขระขีดล่าง
Crono

44

มันบอกผู้บริโภครายอื่นถึงรหัสของคุณว่าเป็นอย่างไร ไปตาม CLSและยังทำให้คอมไพเลอร์ C # ตรวจสอบว่ามันเป็นไปตาม CLS สำหรับคุณ

บทความที่อ้างอิงมีรายละเอียดเพิ่มเติมมากมายเกี่ยวกับความสอดคล้องของ CLS


12
ดังนั้นถ้าฉันเพิ่มคุณลักษณะแล้วสร้างโครงการโดยไม่มีการร้องเรียนนั่นหมายความว่าโครงการของฉันเป็นไปตาม CLS และทั้งหมดนั้นดีหรือไม่
Svish

@ เห็นว่าใช่เป็นกรณีนี้ คอมไพเลอร์จะแจ้งให้คุณทราบหากคุณละเมิดกฎใด ๆ
Drew Noakes

41

คำตอบอื่น ๆ นั้นถูกต้อง ให้ฉันอธิบายบางสิ่งบางอย่าง - CLS ย่อมาจากข้อกำหนดภาษาทั่วไป เป็นชุดกฎขั้นต่ำและคุณสมบัติภาษาที่ต้องการซึ่งภาษา. NET จะต้องนำไปใช้และเข้าใจ ชุดนี้เป็นส่วนย่อยของระบบประเภททั่วไปซึ่งกำหนดวิธีการกำหนดประเภทใน. NET

การเป็นไปตาม CLS หมายความว่าคุณสามารถเขียนโค้ดที่สามารถใช้งานได้กับภาษาใด ๆ ที่สามารถรวบรวมและเรียกใช้บน CLR แต่ไม่จำเป็นต้องปฏิบัติตาม CLS ให้ความยืดหยุ่นแก่คุณในกรณีที่การปฏิบัติตาม CLS นั้นยากหรือเป็นไปไม่ได้

หากคุณต้องการให้นักพัฒนาอื่นใช้รหัสของคุณ API ของคุณ (คลาสสาธารณะและวิธีการ) ควรเป็นไปตาม CLS คุณควรประกาศสิ่งนี้ด้วยการเพิ่ม CLSCompliantAttribute ไปยังแอสเซมบลีของคุณ หากคุณไม่ได้เขียนเพื่อคนอื่นการปฏิบัติตาม CLS นั้นไม่จำเป็นแม้ว่าFxCop ( Framework Cop) จะไม่เห็นด้วยกับฉัน

เมื่อแอสเซมบลีของคุณถูกทำเครื่องหมายด้วย CLSCompliantAttribute คอมไพเลอร์จะ (ควร!) ตรวจสอบรหัสของคุณเพื่อดูว่าเมื่อรวบรวมแล้วมันจะละเมิดกฎ CLS ใด ๆ (ที่ocdecioพูดถึง) และรายงานการละเมิดให้คุณแก้ไข


FxCop พาฉันมาที่นี่
Teoman shipahi

น่าเสียดายที่วิสัยทัศน์ที่ยิ่งใหญ่ของ CLR นั้นมีภาษาส่วนหน้าแตกต่างกันมากมาย (เช่น VB.NET - ซึ่งกำลังจะตายอย่างช้าๆ - และตอนนี้คนอื่น ๆ ก็หายไปเช่น MC ++, Delphi.NET, Oxygene, J #, JScript.NET และอื่น ๆ ) ประโยชน์ของการทำ CLSCompliance ให้สมบูรณ์เนื่องจากภาษาอื่น ๆ ที่เหลือที่รองรับ CLR นั้นไม่มีปัญหาในการสนับสนุนคุณลักษณะที่ไม่ใช่ CLSCompliant เช่นพารามิเตอร์และพารามิเตอร์ทางเลือกout- ดังนั้นฉันคิดว่า Microsoft ต้องทบทวนข้อกำหนดของ CLS อีกครั้งและอาจคลายได้
Dai

13

สอดคล้องกับ CLS เป็นส่วนย่อยของสเปกตรัมภาษาเต็มรูปแบบที่ได้รับอนุญาตจาก CLR โดย จำกัด ไว้เฉพาะชุดย่อยที่มีแนวโน้มว่าจะใช้ได้กับภาษาส่วนใหญ่ที่กำหนดเป้าหมาย CLR สิ่งนี้จะเพิ่มขึ้น แต่ไม่รับประกันว่าห้องสมุดของคุณสามารถใช้งานได้กับทุกภาษาที่กำหนดเป้าหมาย CLR


8

ตามที่เหมาะสมที่นี่: เมื่อต้องการทำเครื่องหมายทั้งโครงการที่สอดคล้องกับ CLS ให้เพิ่มบรรทัดนี้ในAssemblyInfo.cs(สามารถพบได้ในคุณสมบัติในโซลูชัน Explorer)

[assembly:CLSCompliant(true)]

หรือเทียบเท่าใน VB.NET ( AssemblyInfo.vbถูกซ่อนอยู่ภายใต้โครงการของฉัน)

<Assembly: CLSCompliant(True)>

ขอบคุณที่ทำให้รหัสของคุณตาม CLS

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.