Каковы отношения между CTS и CLS?
Я просто не могу понять эти столпы.NET.
5 ответов
CTS (Common Type System) Таким образом, вы можете сказать, что CTS описывает, как типы объявляются, используются и управляются во время выполнения и облегчают межязыковую интеграцию, безопасность типов и выполнение кода с высокой производительностью.
CLS (Спецификация общего языка) Спецификация общего языка (CLS) - это соглашение между разработчиками языков и разработчиками библиотек классов об использовании общего подмножества базовых языковых функций, которым должны следовать все языки.
Как вы можете видеть на изображении, CLS является подмножеством CTS
http://www.microsoft.com/taiwan/msdn/columns/DoNet/images/NET_CTS1.gif
Система общего типа
CTS - это формальная спецификация, описывающая свойства типа:
- Как типы должны быть выложены в IL.
- Каждый тип может состоять из 0 или более следующих членов: свойство, поле, метод и событие.
- Модификаторы доступа (и эквиваленты C#): частный (частный), семейный (защищенный), семейный и сборочный (нет данных), сборочный (без модификатора / внутренний), семейный или сборочный (защищенный внутренний), общедоступный (общедоступный)
- Наследование типов, виртуальные методы
- Каждый тип должен наследоваться от System.Object
- Каждый язык реализует только подмножество функций CTS.
Спецификация общего языка
CLS облегчает взаимодействие между языками.NET на уровне IL:
- Это спецификация компилятора, которая определяет, какой IL должен генерировать компилятор, чтобы код мог взаимодействовать между языками.NET.
- CLS описывает общий набор функций, которые программе разрешено использовать и которые по-прежнему могут взаимодействовать с программами, написанными на других языках.NET.
- Функции CLS являются подмножеством функций CTS.
- CLS важен, только если вы хотите писать свои программы на нескольких языках.
- Важно отметить, что CLS должны соблюдаться только частями кода, помеченными как общедоступные, поскольку они являются единственными, доступными для других программ.
- Если мы аннотируем код с помощью атрибута [assembly: CLSCompliant(true)], то компилятор проверит, совместим ли код с CLS.
Например:
- CLS заявляет, что имена членов не могут быть дифференцированы по регистру: таким образом
Foo()
а такжеfoo()
это одно и то же. - unsigned int нельзя использовать, так как он реализован не всеми языками.NET
Как уже упоминалось, CLS является подмножеством CTS. Но есть гораздо больше в реальном определении этих терминов.
Я предлагаю читать CLR через C#.
Некоторые примеры, безусловно, помогут здесь.
Одной из ключевых вещей, которая не совместима с CLS, являются числа без знака (например, uint). Другой - это указатели на функции (делегаты). Если это не будет иметь смысла на обоих концах строки, то это не "общее"; CLS определяет набор общих типов, которые работают не только в CLR, но также в определенных общих и специфических сценариях взаимодействия.
Если вы хотите обеспечить соответствие CLS, вы можете добавить атрибут "CLSCompliant" в сборку, добавив его в файл assemblyinfo.cs в проекте.
[assembly: CLSCompliant(true)]
Вы также можете добавить его в качестве атрибута в классе.
[CLSCompliant(true)]
public class HospitalLocationEntity : EntityBase
{
...
}
Выполнение этих действий приведет к тому, что компилятор C# (или VB с соответствующим синтаксисом VB в атрибутах) вызовет ошибки компиляции для нарушений соответствия CLS.
Кроме того, добавление атрибутов [ScriptService] и [ScriptMethod] к веб-службам (.asmx) приведет к тому, что служба будет генерировать выходные данные службы JSON, и потребует, чтобы данные, используемые для ответов службы, были помечены как CLSCompliant на уровне классов и сборок.
<System.Web.Services.WebService()> _
<System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<ToolboxItem(False)> _
<ScriptService()> _
Public Class HospitalLocationService
Inherits System.Web.Services.WebService
<WebMethod()> _
<ScriptMethod()> _
Public Function GetAll() As List(Of HospitalLocationEntity)
Return (New HospitalLocation()).GetAll().Data
End Function
End Class
ЦЛС
CLS расшифровывается как Common Language Specification и является подмножеством CTS. Он определяет набор правил и ограничений, которым должен следовать каждый язык, работающий в среде .NET. Языки, которые следуют этому набору правил, называются CLS-совместимыми. Проще говоря, CLS обеспечивает межъязыковую интеграцию или совместимость.
Например
если мы говорим о C# и VB.NET, то в C# каждый оператор должен заканчиваться точкой с запятой. его также называют терминатором оператора, но в VB.NET каждый оператор не должен заканчиваться точкой с запятой (;). Объяснение приведенного выше примера
Таким образом, эти правила синтаксиса, которым вы должны следовать от языка к языку, различаются, но CLR может понимать весь синтаксис языка, потому что в .NET каждый язык после компиляции преобразуется в код MSIL, а код MSIL является языковой спецификацией CLR.
КТС
Система общих типов (CTS) описывает типы данных, которые могут использоваться управляемым кодом. CTS определяет, как эти типы объявляются, используются и управляются во время выполнения. Это облегчает межъязыковую интеграцию, безопасность типов и высокопроизводительное выполнение кода. Правила, определенные в CTS, можно использовать для определения ваших собственных классов и значений.
ИЛИ мы также можем понять, например,
CTS имеет дело с типом данных. Итак, здесь у нас есть несколько языков, и каждый язык имеет свой собственный тип данных, и один тип данных языка не может быть понятен другими языками, но язык .NET Framework может понимать все типы данных.