Thuộc tính 'CLSCompliant' trong .NET là gì?


Câu trả lời:


181

Bạn đánh dấu các lớp bằng CLSCompliantthuộc tính khi bạn muốn đảm bảo nó có thể được sử dụng bởi bất kỳ ngôn ngữ .NET nào khác.
Đây là những quy tắc cơ bản:

  1. Các kiểu không được gán không nên là một phần của giao diện chung của lớp. Điều này có nghĩa là các trường công cộng không nên có các kiểu không dấu như uinthoặc ulong, các phương thức công khai không nên trả về các kiểu không dấu, các tham số được truyền cho hàm công khai không nên có các kiểu không dấu. Tuy nhiên các loại không dấu có thể là một phần của các thành viên tư nhân.

  2. Các loại không an toàn như con trỏ không nên được sử dụng với publiccác thành viên. Tuy nhiên, chúng có thể được sử dụng với privatecác thành viên.

  3. Tên lớp và tên thành viên không nên chỉ khác nhau dựa trên trường hợp của họ. Ví dụ, chúng ta không thể có hai phương thức được đặt tên MyMethodMYMETHOD.

  4. Chỉ các thuộc tính và phương thức có thể bị quá tải, các toán tử không được quá tải.


Bạn sẽ làm điều đó như một mặc định cho mọi dự án?
Naeem Sarfraz

3
Không nhất thiết, chủ yếu cho những người có thể tiếp xúc với các ngôn ngữ .net khác.
Otávio Décio

1
Một hạn chế khác là CS3006: Phương thức quá tải 'Foo.Bar (ref Baz)' chỉ khác nhau về ref hoặc out, hoặc trong xếp hạng mảng, không tuân thủ CLS
Drew Noakes

Một điều nữa: các định danh công khai không nên bắt đầu bằng một ký tự gạch dưới.
Crono

44

Nó nói với những người tiêu dùng khác về mã của bạn rằng nó tuân thủ CLS và cũng làm cho trình biên dịch C # kiểm tra xem nó có tuân thủ CLS cho bạn không.

Bài viết được tham khảo chứa nhiều chi tiết hơn về những gì tuân thủ CLS đòi hỏi.


12
Vì vậy, nếu tôi thêm thuộc tính và sau đó xây dựng dự án của mình mà không có khiếu nại, điều đó có nghĩa là dự án của tôi tuân thủ CLS và tất cả đều tốt?
Svish

@Svish, đúng là như vậy. Trình biên dịch sẽ cho bạn biết nếu bạn vi phạm bất kỳ quy tắc nào.
Drew Noakes

41

Các câu trả lời khác là chính xác. Hãy để tôi làm rõ một số điều - CLS là viết tắt của Đặc tả ngôn ngữ chung. Đó là bộ quy tắc tối thiểu và các tính năng ngôn ngữ bắt buộc mà ngôn ngữ .NET phải triển khai và hiểu. Bộ này là một tập hợp con của hệ thống loại phổ biến , định nghĩa cách các loại được định nghĩa trong .NET.

Tuân thủ CLS có nghĩa là bạn có thể viết mã có thể được sử dụng bởi bất kỳ ngôn ngữ nào có thể được biên dịch và chạy trên CLR. Nhưng việc tuân thủ CLS là không bắt buộc, mang lại cho bạn sự linh hoạt trong trường hợp tuân thủ CLS sẽ khó hoặc không thể thực hiện được.

Nếu bạn dự định mã của bạn sẽ được các nhà phát triển khác sử dụng, API của bạn (các lớp và phương thức công khai của bạn) phải tuân thủ CLS. Bạn nên khai báo điều này bằng cách thêm CLSCompliantAttribution vào các hội đồng của bạn. Nếu bạn không viết cho người khác, việc tuân thủ CLS là không cần thiết, mặc dù FxCop ( Framework Cop) sẽ không đồng ý với tôi.

Khi tập hợp của bạn được đánh dấu bằng CLSCompliantAttribution, trình biên dịch sẽ (nên!) Kiểm tra mã của bạn để xem, khi được biên dịch, nó sẽ vi phạm bất kỳ quy tắc CLS nào (một số trong đó ocdecio đã đề cập) và báo cáo vi phạm cho bạn để sửa.


FxCop đã đưa tôi đến đây.
Teoman shipahi

Thật không may, tầm nhìn lớn của CLR có nhiều ngôn ngữ ngoại vi khác nhau (như VB.NET - sắp chết chậm - và các ngôn ngữ khác đã biến mất, như MC ++, Delphi.NET, Oxygene, J #, JScript.NET, v.v.) lợi ích của việc hoàn thành CLSCompliance là các ngôn ngữ còn lại hỗ trợ CLR không gặp vấn đề gì khi hỗ trợ các tính năng không phải CLSCompliant như các tham số và tham số tùy chọn out- vì vậy tôi nghĩ Microsoft cần xem lại các yêu cầu của CLS và có thể nới lỏng chúng.
Đại

13

Tuân thủ CLS là tập hợp con của phổ ngôn ngữ đầy đủ được CLR cho phép. Nó giới hạn nó ở các tập hợp con có khả năng có sẵn bởi phần lớn các ngôn ngữ nhắm vào CLR. Điều này tăng, nhưng không đảm bảo rằng thư viện của bạn có thể được sử dụng bởi tất cả các ngôn ngữ nhắm mục tiêu CLR.


8

Vì nó phù hợp ở đây: Để đánh dấu toàn bộ dự án tuân thủ CLS, hãy thêm dòng này vào AssemblyInfo.cs(có thể tìm thấy trong Thuộc tính trong Solution Explorer)

[assembly:CLSCompliant(true)]

hoặc tương đương trong VB.NET ( AssemblyInfo.vbđược ẩn trong Dự án của tôi)

<Assembly: CLSCompliant(True)>

Nhờ làm cho Mã của bạn tuân thủ CLS .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.