Почему C # включает программные конструкции, которые не совместимы с CLS? - PullRequest
8 голосов
/ 17 февраля 2011

Кажется странным, что флагманский язык .NET будет включать в себя программные конструкции, не совместимые с CLS.Почему это так?

Пример (из здесь ): Два или более открытых / защищенных / защищенных внутренних элемента, определенных только с разницей в регистре

public int intA = 0;
public int INTA = 2; 

или

public int x = 0;

public void X()
{
} 

Ответы [ 7 ]

16 голосов
/ 17 февраля 2011

Даже целые числа без знака не совместимы (по крайней мере, в общедоступном API), но они очень важны для людей, которые выполняют сдвиг битов, в частности, при сдвиге вправо (подпись и беззнак имеют различное поведение сдвига вправо).

Они в конечном счете, чтобы дать вам свободу использовать их в случае необходимости .Чувствительность к регистру, о которой я мог бы быть менее религиозным - несмотря на то, что удобство в том, что поле и свойство различаются только в каждом конкретном случае, я думаю, что я мог бы жить счастливо, будучи вынужденным использовать другое имя!Особенно теперь мы автоматически реализовали свойства ...

Это похоже на то, как он позволяет использовать unsafe - разница здесь в том, что несколько целых чисел без знака не будут дестабилизировать всю среду выполнения, поэтому онивам не нужны такие сильные молли-охранники.

Вы можете добавить:

[assembly: CLSCompliant(true)]

, если хотите, и компилятор сообщит вам, если вы ошиблись.

И наконец: большинство код (по объему) не используется как компонент.Он написан для выполнения работы и может быть использован другим внутренним кодом.В основном авторы / поставщики библиотек должны беспокоиться о таких вещах, как соответствие CLS.Это (по номерам) меньшинство.

14 голосов
/ 17 февраля 2011

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

Вы должны убедиться, что публично видимые типы в вашей сборке соответствуют CLS. Убедиться в том, что ученики не различаются только в каждом конкретном случае, очень просто. Позвольте компилятору помочь вам, используя атрибут [assembly: CLSCompliant (true)], и компилятор предупредит вас, когда вы поскользнулись.

4 голосов
/ 17 февраля 2011

См. http://msdn.microsoft.com/en-us/library/bhc3fa7f.aspx.

CLS - это спецификация, к которой можно подключиться. Цитата сверху:

При разработке собственных CLS-совместимых компонентов полезно использовать CLS-совместимый инструмент. Написание CLS-совместимых компонентов без этой поддержки сложнее, поскольку в противном случае у вас может не быть доступа ко всем функциям CLS, которые вы хотите использовать.

Некоторые CLS-совместимые языковые компиляторы, такие как компиляторы C # или Visual Basic, позволяют указать, что вы хотите, чтобы ваш код был CLS-совместимым. Эти компиляторы могут проверять соответствие CLS и сообщать вам, когда ваш код использует функциональность, которая не поддерживается CLS. Компиляторы C # и Visual Basic позволяют пометить программный элемент как CLS-совместимый, что приведет к тому, что компилятор сгенерирует ошибку времени компиляции, если код не является CLS-совместимым. Например, следующий код генерирует предупреждение компилятора.


Пример кода по ссылке выше:

using System;

// Assembly marked as compliant.
[assembly: CLSCompliant(true)]

// Class marked as compliant.
[CLSCompliant(true)]
public class MyCompliantClass {
   // ChangeValue exposes UInt32, which is not in CLS.
   // A compile-time warning results.
   public void ChangeValue(UInt32 value){ }

   public static void Main( ) {
   int i = 2;
   Console.WriteLine(i);
   }
}

Этот код генерирует следующее предупреждение C #:

Предупреждение о копировании CS3001: тип аргумента 'uint' не соответствует CLS

3 голосов
/ 17 февраля 2011

Мои два цента о соответствии CLS

Языки .net - это эволюция языков, которые существовали на момент создания. Языки были созданы таким образом, чтобы вы могли легко преобразовать базовые проекты в проекты .Net без особых усилий по разработке. Из-за огромных различий между языками необходимо было договориться, чтобы языки разговаривали друг с другом. Возьмите примеры языка ниже:

VB.Net - это язык, производный от более раннего языка VB6. Предполагается, что он очень похож по стилю на VB6 и поэтому использует много соглашений, используемых VB6. Поскольку предполагалось, что VB6 будет простым в освоении / использовании не разработчиками, у него есть определенные характеристики, которые делают его более идиотским доказательством. Динамическая типизация, регистронезависимость - вот две вещи.

C # .Net / C ++. Net являются производными от более дружественного для программиста C ++. Поскольку они являются эволюцией этого языка, в нем есть вещи, которые C ++ позволит вам сделать. Чувствительность к регистру, статическая типизация и т. Д.

Теперь, столкнувшись с двумя разными языками, которые они хотели сделать совместимыми, Microsoft сделала единственную разумную вещь. Они наложили ограничения на то, как эти два языка могут взаимодействовать друг с другом посредством использования в основном контракта на программное обеспечение. Этот код может использоваться только таким образом из-за различий в языках.

Например, возьмите код VB.Net, вызывающий код C # Если бы код C # имел две функции, которые различались только в случае, X () и x (), VB.net никогда бы не смог правильно вызвать этот код, так как он не учитывает регистр. Соблюдение CLS должно сделать это незаконным. Если вы посмотрите на другие правила, они в основном делают то же самое для других языковых функций между разными языками.

2 голосов
/ 17 февраля 2011

Я думаю, нечувствительность к регистру была включена только в соответствие CLS, чтобы VB.NET мог быть CLS-совместимым. Из того, что я понимаю, нет проблемы, если конкретная языковая конструкция не совместима с CLS, если вы не используете ее таким образом, чтобы несовместимые куски были доступны в открытом API вашего кода.

Намек от Microsoft может показаться, что соответствие CLS важно только в коде, к которому вы обращаетесь с разных языков (например, ссылка на сборку C # из проекта VB.NET).

1 голос
/ 17 февраля 2011

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

0 голосов
/ 15 ноября 2012

Если бы было всеобщее согласие относительно того, какие функции должны быть включены в язык программирования, миру понадобился бы только один язык программирования (который включал бы именно те функции, которые, как все согласились, должны были присутствовать).Конечно, на самом деле некоторые люди считают важными чертами, которые другим не безразличны (или даже считают неприятными).Стандарт CLS по существу делает три вещи:

  1. Он говорит, что определенные функции настолько важны, что любой язык, который их не включает, должен рассматриваться как неадекватный для программирования общего назначения .net.
  2. В нем говорится, что программисты, библиотекам которых не требуются какие-либо функции, кроме перечисленных, должны ожидать, что их библиотеки будут использоваться программистами, использующими любой язык, подходящий для программирования общего назначения .net.
  3. Он сообщает программистам, что если части их библиотек потребуют использования функций, которые не требуются для поддержки языков, эти части могут быть недоступны для языков, которые подходят для программирования .net, но не включают требуемые функции,

Когда языки, такие как vb.net или C #, позволяют создавать не-CLS-совместимое программирование, это означает, что Microsoft решила, что некоторые функции были достаточно полезны, чтобы оправдать включение в эти языки, но не настолько замечательны или не вызывают сомненийчтобы оправдать обязательность всех языков, включая их.

...