Что такое атрибут CLSCompliant в .NET?

Ответы:

181

Вы помечаете классы CLSCompliantатрибутом, когда хотите убедиться, что он может использоваться любым другим языком .NET.
Это основные правила:

  1. Типы без знака не должны быть частью открытого интерфейса класса. Это означает, что открытые поля не должны иметь неподписанные типы, такие как uintили ulong, публичные методы не должны возвращать неподписанные типы, параметры, передаваемые в открытую функцию, не должны иметь неподписанные типы. Однако неподписанные типы могут быть частными членами.

  2. Небезопасные типы, такие как указатели, не должны использоваться с publicчленами. Однако они могут быть использованы с privateчленами.

  3. Имена классов и имена членов не должны отличаться только в зависимости от их регистра. Например, у нас не может быть двух названных методов MyMethodи MYMETHOD.

  4. Только свойства и методы могут быть перегружены, операторы не должны быть перегружены.

Otávio Décio
источник
Вы бы сделали это по умолчанию для каждого проекта?
Наим Сарфраз
3
Не обязательно, в основном для тех, кто может иметь представление о других языках .net.
Otávio Décio
1
Другое ограничение - CS3006: перегруженный метод 'Foo.Bar (ref Baz)', отличающийся только ref или out или ранжированием массива, не соответствует CLS
Дрю Ноакс
Еще одно: публичные идентификаторы не должны начинаться с символа подчеркивания.
Crono
44

Он сообщает другим пользователям вашего кода, что он совместим с CLS , а также заставляет компилятор C # проверить, что он совместим с CLS для вас.

Ссылочная статья содержит гораздо больше подробностей о том, что влечет за собой соответствие CLS.

Джон Скит
источник
12
Так что, если я добавлю атрибут, а затем соберу свой проект без жалоб, это означает, что мой проект совместим с CLS и все хорошо?
Свиш
@ Свист, да, это так. Компилятор сообщит вам, если вы нарушите какие-либо правила.
Дрю Ноакс
41

Другие ответы верны. Позвольте мне уточнить некоторые вещи - CLS расшифровывается как Common Language Specification. Это минимальный набор правил и требуемых языковых функций, которые должен реализовывать и понимать язык .NET. Этот набор является подмножеством системы общих типов , которая определяет, как типы определяются в .NET.

Совместимость с CLS означает, что вы можете писать код, который может использоваться любым языком, который можно скомпилировать и запустить на CLR. Но соответствие CLS не требуется, что дает вам гибкость в тех случаях, когда соответствие CLS будет трудно или невозможно сделать.

Если вы хотите, чтобы ваш код использовался другими разработчиками, ваш API (ваши общедоступные классы и методы) должны быть совместимы с CLS. Вы должны заявить об этом, добавив CLSCompliantAttribute в свои сборки. Если вы пишете не для других, соответствие CLS не требуется, хотя FxCop ( Framework Cop) не согласится со мной.

Когда ваша сборка помечена с помощью CLSCompliantAttribute, компилятор (должен!) Проверит ваш код, чтобы выяснить, не нарушит ли он при компиляции какое-либо из правил CLS (некоторые из которых упоминалось в ocdecio ), и сообщит вам о нарушениях для исправления.

Питер Мортенсен
источник
FxCop привел меня сюда.
Теоман Шипахи
К сожалению, великое видение того, что CLR имеет множество различных языков интерфейса (например, VB.NET - который умирает медленной смертью - и другие, как MC ++, Delphi.NET, Oxygene, J #, JScript.NET и т. Д.), Ограничивает ограничения. Преимущества завершения CLSCompliance, учитывая, что другие оставшиеся языки, которые поддерживают CLR, не имеют проблем с поддержкой функций, не соответствующих CLSC, таких как необязательные параметры и outпараметры - поэтому я думаю, что Microsoft необходимо пересмотреть требования CLS и, возможно, ослабить их.
Дай
13

CLS-совместимый является подмножеством полного языкового спектра, разрешенного CLR. Он ограничивается подмножествами, которые, вероятно, доступны большинству языков, нацеленных на CLR. Это увеличивает, но не гарантирует, что ваша библиотека может использоваться всеми языками, ориентированными на CLR.

JaredPar
источник
8

Как это подходит здесь: Чтобы отметить весь проект, совместимый с CLS, добавьте эту строку AssemblyInfo.cs(можно найти в разделе «Свойства» в обозревателе решений).

[assembly:CLSCompliant(true)]

или аналогично в VB.NET ( AssemblyInfo.vbскрыто в Моем проекте)

<Assembly: CLSCompliant(True)>

Благодаря тому, что ваш код совместим с CLS .

Маркус Хартмайр
источник