• CLR_via_C#.3rd 翻译[1.7 通用类型系统]


    1.7 The Common Type System 通用类型系统

     

    到目前为止,你应该已经知道CLR是关于类型的。类型为应用程序和组件提供了它们所需的功能。类型也作为一种机制是的一种语言编写的代码可以和另一种语言编写的代码进行无缝的继承。犹豫类型是CLR的基础,微软为此专门指定了一个正式的规范——通用类型系统(Conmmon Type System)来描述类型的定义和行为。

     

    Note实际上微软已经向ECMA提交了CTS,以及其他的.NET框架部分,包括文件格式化、元数据、IL以及访问底层的平台(P/Invoke),以期获得标准化的许可。这个标准叫做通用语言基础(Common Language Infreastructure 简称CLI)符合ECMA-335规定。另外,微软也提交了FCL的一部分、 C#编程语言(ECMA-334)、以及C++/CLI 编程语言。如果你想了解产业标准,可以到ECMA的网站查看。

     

    CTS规范规定一个类型可以包含0个或多个成员。本书的第Ⅱ部分,我将会对所有这些成员做详细的介绍。目前大家只需要对它们有一个简单的了解。

      ■ 字段 字段是一个属于数据状态部分的数据成员。字段由它们的名称和类型标志。

      ■ 方法 方法是一个在对象上执行某种操作的函数,通常会改变对象的状态,方法有一个名称、签名和修饰符。方法的签名指定了方法的调用约定、参数个数(以及它们的顺序)、参数类型以及返回值类型

      ■ 属性 对于属性的调用者,属性看起来非常类似字段。但是对于属性的实现者,属性开起来更像一个(或者两个)方法。属性允许实现者在访问数值之前验证输入参数和对象状态的有效性,或者仅在需要的情况下进行求值运算。属性是的类型的用户可以使用简化的语法来表达它们的意图。可以创建只读、只写、读写三种属性。

      ■ 事件 事件允许在一个对象和其他相关联的对象之间建立一个通知机制。例如,一个按钮可以提供一个事件,当该按钮被按下时,其他对象将得到通知。

     

    CTS还定义了类型可见性和访问类型成员的一些规则。例如,将一个类型修饰为public,将是的它对于任何程序集都是可见的。另一方面,将一个类型定义为assembly(在C#里叫做internal),将是的它仅对于其所定义的程序集中的代码可见。CTS建立了以程序集为类型可见性边界的规则,而CLR实现了这种可见性规则。

      ■ Private 方法只能被同一个类型中的其他方法所见。

      ■ Family 方法可以被派生类型中的代码调用,而不管它们是否位于同一个程序集中。注意许多编程语言(例如C++C#)都将之称作protected

      ■ Family  assembly 方法只能被位于同一个程序集中的派生类型中的代码调用。许多编程语言(例如VBC#)都没有提供这种访问机制。当然,IL汇编语言可以做到这一点。

      ■ Assembly 方法可以被同一个程序集中的任何代码调用。许多编程语言将之成为internal

      ■ Family 或 Assembly 方法可以被任何程序集中的派生类型的代码调用,也可以被同一个程序集中的任何类型调用。C#称之为protected internal

      ■ Public 方法可以被任何程序集中的任何代码调用

     

    另外,CTS还为类型继承,虚方法,对象生存期等等定义了相应的规则。设计这些规则的目的在于使它们的语义可以用现代编程语言方便的表达出来。实际上,我们甚至不需要学习CTS规则,因为我们选择的语言已经提供了我们所熟悉的语言语法和类型规则,并且在生成托管模块时会将这些特定语言的语法映射为CLR语言。

     

    当我第一次使用CLR的时候,我马上意识到最好将语言和代码行为视为两个分离的,独立的部分。我们可以使用C++来定义自己的类型和成员,我们也可以使用C#或者VB来定义同样的类型和成员。虽然定义类型所使用的语法因所选语言的不同而各不相同,但是类型的行为绝对是完全相同、和语言无关的,因为CLR中的CTS定义了类型的行为。

     

    为了帮助你清楚的了解这种思想,我给你一个例子。CTS允许一个类型实现但继承。所以,尽管C++语言支持多继承,但是CTS不接受也不会操作任何这样的类型。为了帮助开发者,微软C++/CLI编译器会在出现多继承的时候报错。

     

    这里是另一个CTS规则。所有的类型都必须(直接或者间接)继承自一个预定义的类型:Sytem.Object。就像你看到的,Object是定义在system命名空间中的一个类型。Object作为所有其他类型的根类保证了每个类型实例都有一组公共行为。具体而言,system.Object类型允许我们执行一下操作:

      ● 判断两个实例是否相等

      ● 获得实例的hash

      ● 查询实例的真正类型

      ● 实现一个类型的浅拷贝(即按位,bitwise

      ● 获得实例当前状态的字符串表示

  • 相关阅读:
    提取 Microsoft.ReportViewer.ProcessingObjectModel.dll Microsoft.ReportViewer.DataVisualization.dll 等dll(转贴)
    Windows API 逐个逐个学(0) MessageBox
    asp程序员使用asp.net中服务器控件的困惑
    SQLServer 存储过程中不拼接SQL字符串实现多条件查询
    工作学习笔记
    c#3.0/3.5 中的一些新特性
    firefox中使用ctrl+0解决了一个调试很长时间的问题
    使用Nunit进行单元测试
    asp.net 用户控件和自定义控件总结
    Visual Studio 2008 无法启动调试.找不到Microsoft Internet Explorer
  • 原文地址:https://www.cnblogs.com/TivonStone/p/1811938.html
Copyright © 2020-2023  润新知