我似乎无法理解 .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# 等效项):private(私有)、family(受保护)、family and assembly (N/A)、assembly(无修饰符/内部)、family or assembly(受保护内部)、public(公共)
- 类型继承,虚方法
- 每种类型都必须继承自 System.Object
- 每种语言仅实现 CTS 功能的一个子集。
通用语言规范
CLS 在 IL 级别促进 .NET 语言之间的互操作性:
- 它是一个编译器规范,用于确定编译器必须发出什么 IL,以使代码在 .NET 语言之间可互操作。
- CLS 描述了一组通用的功能,程序可以使用这些功能,并且仍然可以与用其他 .NET 语言编写的程序进行互操作。
- CLS 功能是 CTS 功能的子集。
- 仅当您希望以多种语言编写程序时,CLS 才重要。
- 需要注意的重要一点是,CLS 必须仅由标记为公共的代码片段遵守,因为这些是唯一可用于其他程序的代码。
- 如果我们用 [assembly: CLSCompliant(true)] 属性注释代码,那么编译器将检查代码是否符合 CLS。
例如:
- CLS 声明成员名称不能区分大小写:因此
Foo()
和foo()
是同一件事。 - unsigned int 不能使用,因为它不是由所有 .NET 语言实现的
如前所述,CLS 是 CTS 的子集。但是这些术语的实际定义还有很多。
我建议通过 C# 阅读 CLR。
一些例子在这里肯定会有所帮助。
不符合 CLS 的关键之一是无符号数(例如,uint)。另一个是函数指针(委托)。如果它在线路的两端都没有意义,那么它就不是“常见的”;CLS 定义了一组通用类型,这些类型不仅可以在 CLR 中使用,而且还可以在某些通用且明确指定的互操作场景中使用。
如果要强制执行 CLS 合规性,可以通过将“CLSCompliant”属性添加到项目中的 assemblyinfo.cs 文件来将其添加到程序集。
[assembly: CLSCompliant(true)]
您还可以将其添加为类的属性。
[CLSCompliant(true)]
public class HospitalLocationEntity : EntityBase
{
...
}
执行这些操作将导致 C# 编译器(或 VB,在属性上具有适当的 VB 语法)引发违反 CLS 合规性的编译错误。
此外,将 [ScriptService] 和 [ScriptMethod] 属性添加到 Web 服务 (.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
CLS 代表通用语言规范,它是 CTS 的子集。它定义了在 .NET 框架下运行的每种语言必须遵循的一组规则和限制。遵循这些规则的语言被称为符合 CLS。简而言之,CLS 支持跨语言集成或互操作性。
例如
如果我们谈论 C# 和 VB.NET,那么在 C# 中,每条语句都必须以分号结尾。它也称为语句终止符,但在 VB.NET 中,每个语句不应以分号 (;) 结尾。上述例子的解释
所以你必须遵循的这些语法规则因语言而异,但 CLR 可以理解所有语言语法,因为在 .NET 中,每种语言在编译后都会转换为 MSIL 代码,而 MSIL 代码是 CLR 的语言规范。
中旅
通用类型系统 (CTS) 描述了托管代码可以使用的数据类型。CTS 定义了如何在运行时声明、使用和管理这些类型。它有助于跨语言集成、类型安全和高性能代码执行。CTS 中定义的规则可用于定义您自己的类和值。
或者我们也可以这样理解,
CTS 处理数据类型。所以这里我们有几种语言,每种语言都有自己的数据类型,一种语言的数据类型不能被其他语言理解,但 .NET Framework 语言可以理解所有的数据类型。