CTS和CLS之间有什么关系?

时间:2010-06-05 12:03:51

标签: c# .net clr cls

我似乎无法理解.NET的这些支柱。

4 个答案:

答案 0 :(得分:1)

CTS(通用型系统) 所以你可以说CTS描述了如何在运行时声明,使用和管理类型,并促进跨语言集成,类型安全和高性能代码执行。

CLS(通用语言规范) 公共语言规范(CLS)是语言设计者和类库设计者之间的协议,它使用所有语言必须遵循的基本语言特性的公共子集。

正如您在图像中看到的,CLS是CTS的子集

alt text http://www.microsoft.com/taiwan/msdn/columns/DoNet/images/NET_CTS1.gif

答案 1 :(得分:0)

如前所述,CLS是CTS的子集。但这些术语的实际定义还有很多。

我建议阅读CLR via C#

答案 2 :(得分:0)

一些例子肯定会有所帮助。

不符合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

答案 3 :(得分:0)

通用类型系统

CTS是描述类型属性的正式规范:

  • 如何在IL中布置类型。
  • 每个类型可以包含0个或多个以下成员:属性,字段,方法 和事件。
  • 访问修饰符(和C#等效项):私有(私有),家庭(受保护), 家族和装配体(N / A),装配体(无修饰符/内部),家族或装配体 (受保护的内部),公共(公共)
  • 类型继承,虚拟方法
  • 每种类型都必须继承自System.Object
  • 每种语言仅实现CTS功能的一部分。

公共语言规范

CLS在IL级别促进.NET语言之间的互操作性:

  • 这是一个编译器规范,用于确定编译器必须发出的IL 为了使代码在.NET语言之间可互操作。
  • CLS描述了允许程序使用的一组通用功能 并且仍然可以与用其他.NET语言编写的程序互操作。
  • CLS功能是CTS功能的子集。
  • CLS仅在您希望以多种方式编写程序时才重要 语言。
  • 需要注意的重要一点是,CLS必须仅通过以下几部分来遵守 标记为“公开”的代码,因为这些是唯一可用于其他人的代码 程序。
  • 如果我们使用[assembly:CLSCompliant(true)]属性注释代码,则 编译器将检查代码是否符合CLS。

例如:

  • CLS声明成员名称不能区分大小写:因此Foo()foo()是同一件事。
  • 未签名的int不能使用,因为并非所有.NET语言都实现了它