С#:Массивы с отсчетом от нуля не совместимы с CLS.

StackOverflow https://stackoverflow.com/questions/955732

  •  11-09-2019
  •  | 
  •  

Вопрос

я сейчас читаю Альбахари's C# 3.0 в двух словах и на стр.241, говоря об индексации массива, он говорит следующее:

Ненулевые массивы не являются CLS (спецификация общего языка)-

Что именно означает, что ненулевые массивы не должны быть CLS-совместимый ?И какие последствия это имеет для вашего кода?

[Обновлять]

Здесь это ссылка на страницу книги.

Это было полезно?

Решение

CLS (общая языковая спецификация) закладывает основу для общего набора правил соответствия, гарантирующего, что другие языки (VB.NET, F# и т. д.) могут использовать сборки, созданные вами с помощью C#.Массив с отсчетом от нуля не будет соответствовать требованиям, поскольку другие языки ожидают, что массивы будут отсчитываться от нуля.

Вот пример, который легче понять:

class Foo
{
    public void Bar() { }
    public void bar() { } 
}

Этот тип будет нет быть совместимым с CLS, поскольку он содержит два элемента, которые различаются по имени только по типу.Как кто-то, использующий VB.NET, мог бы устранить неоднозначность между Bar и bar поскольку компилятор VB.NET не учитывает регистр?

По сути, CLS — это набор подобных правил, гарантирующих совместимость между языками.

Другие советы

Соответствие CLS в основном связано с обеспечением максимально широкой совместимости вашего кода с другими языками.Он включает в себя такие вещи, как не раскрытие открытых членов, которые различаются только регистром (что может сбить с толку VB, который нечувствителен к регистру).Видеть это Статья MSDN для получения дополнительной информации, а также спецификация общего языка сам.

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

Из-за проблем с соответствием CLS (и других соображений) не рекомендуется использовать их в .NET (даже при программировании VB.NET).Более того, их использование довольно ограничено.Проще выполнить сдвиг смещения, инкапсулировав массив внутри класса и написав соответствующий оператор доступа к индексу.

Также,

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

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

Всегда полезно использовать [assembly:CLSCompliant(true)], но это не критично для запуска вашего приложения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top