Когда допустимо нарушение требований CLS?

Мне было интересно, какие существуют крайние случаи, которые могут сделать Соответствие спецификации общего языка приемлемо. Я думаю, что даже если не предполагается доступ с других языков, принципы, изложенные в _ 1_ являются передовыми методами.

Сталкивались ли вы / знаете ли вы о случаях, когда YAGNI перевешивает лучшие практики?


person David Schmitt    schedule 12.02.2009    source источник
comment
Если вы создаете приложение, которое не будет использоваться в качестве библиотеки, и знаете, что оно не будет перенесено на другие платформы (например, Mono), какой смысл в совместимости с CLS?   -  person Hosam Aly    schedule 12.02.2009
comment
Опора только на регистр - это хорошая практика при различении свойств и их частных полей поддержки. Или это исключение из вашего правила?   -  person Dave Van den Eynde    schedule 12.02.2009
comment
@Hosam Aly: например, не полагаться на регистр для различения членов - хорошая практика независимо от переноса или использования.   -  person David Schmitt    schedule 12.02.2009
comment
@Dave Case только различия между общедоступными свойствами и частными резервными полями совместимы с CLS. Это только различия между общедоступными членами (или членами, доступными за пределами класса), которых нет.   -  person Jason S    schedule 09.09.2011


Ответы (3)


"[sic] Какая польза от соответствия требованиям CLS?"

Среднее доверие, ClickOnce, запуск с общего сетевого диска, гостевые профили в настройках домена и т. д. Существует множество ситуаций безопасности, когда ваш код не может работать если вы нарушите соответствие требованиям CLS.

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

В общем, обычно есть способы обойти проблему. Я бы придерживался противоположного подхода к комментариям выше, зачем его нарушать? Вы пишете управляемый код, зачем вам намеренно ограничивать свое приложение?

Я бы сказал, что если вы создаете сборку или компонент API, вы всегда должны их придерживаться. Слишком много сторонних компонентов находят простой выход и просто помечают их как сломанные при попытке запустить со средним уровнем доверия. В некоторых случаях это единственная причина, по которой они не могут работать. Если бы им потребовалось немного больше времени, чтобы придерживаться рекомендаций, пользователи не были бы ограничены в том, как они могут использовать свой компонент.

person Jason Short    schedule 24.09.2009
comment
Какая связь между соблюдением CLS и доверием? Я думал, что несовместимость с CLS просто означает, что некоторые функции вашего класса могут быть непригодны для использования на некоторых языках; например если коллекция предоставляет только свое свойство Count как UInt32, код, написанный на языках, которые не поддерживают этот тип, не сможет определить, сколько элементов в ней. Если какая-то функция имеет смысл только в языках, которые поддерживают беззнаковые типы (например, вызов UInt32 перегрузки функции в стиле Interlocked.Increment имел бы смысл только в том случае, если бы кто-то уже имел такую ​​UInt32 переменную для увеличения) ... - person supercat; 14.11.2012
comment
... Я не вижу причин, по которым включение такой перегрузки должно считаться плохим или ограничивать контексты безопасности, в которых можно использовать код. - person supercat; 14.11.2012

Что ж, массивы "params" атрибутов иногда просто заманчивы (но несовместимы). Но я бы рекомендовал по возможности использовать CLS-совместимые подходы.

person Marc Gravell    schedule 12.02.2009

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

Но затем эти несовместимые интерфейсы следует повторно инкапсулировать на более высоком уровне.

person thinkbeforecoding    schedule 12.02.2009
comment
Я согласен. Пока библиотека предназначена для внутреннего использования, и вы можете контролировать ее использование, это не должно быть проблемой. - person Rune Grimstad; 12.02.2009