Microsoft.NET 框架程序设计 —— 类型基础

        本文主要介绍有关类型和通用语言运行时(CLR)的一些基础知识。特别地,我们将会讨论每个类型都具有的一组公共行为。另外,我们还会谈到类型安全、对象转型以及有关命名空间与程序集的些话题。

4.1 所有类型的基类型:System.Obiect

CLR要求每个类型最终都要继承自System.Object类型。这意味着下面两种类型定义(使用 C#描述)是等同的:

// 隐式继承 0bject
class Employee{
    ...
}

//显式继承 object
class Employee :System.0bject{
    ...
}

        因为每个类型最终都会继承自System.Object,所以我们就可以确保任何对象都有一组方法的最小集合。表4.1列出了System.Object类提供的几个公有实例方法。

公有方法 描 述
Equals 如果两个对象具有相同的值,方法将返回true。
GetHashCode 方法返回对象的值的散列码。如果一个对象被用作散列表的一个键值,那么该对象的类型应该重写GetHashCode方法。该方法应该为类型的不同对象之间提供一个良好的区分。
ToString 默认情况下,方法返回类型全名(this.GetType().FullName.ToString())。但是还有一种常见的做法是重写该方法使其返回一个表示对象状态的字符串例如,.NET框架中的一些核心类型(如Boolean和Int32)就重写了该方法,使其返回表示它们的值的一个字符串。另一种常见的做法是重写该方法以用于调试目的:我们可以通过调用它来得到一个表示对象字段值的字符串。注意ToString通常会利用与调用线程相关联的CultureInfo。
GetType 方法返回一个类型为继承自Type的对象实例,其标识了该方法所属对象的类型。返回的Type 对象可以和反射类一起使用来获得类型的元数据信息。注意GetType方法是一个非虚方法,这可以防止一个类通过重写该方法而隐瞒它的类型,从而破坏类型安全。

 表4.2 System.0bject 的受保护方法

受保护方法 描 述
MemberwiseClone 这是一个非虚方法,它创建一个新的类型实例,并将其字段设置为和this对象的字段相同,最后返回新创建的实例引用。
Finalize 这是一个虚方法,当垃圾收集器判定某个对象为可回收的垃圾时,垃圾收集器会在对象内存被回收之前调用此方法。那些内存回收时需要资源清理的类型应该重写该方法。

        CLR 要求所有的对象都要用new操作符来创建(该操作符将产生newobj1指令)。下面的语句展示了怎样创建一个 Employee 对象:

        Employee e=new Employee("ConstructorParaml");

下面是new操作符所执行的工作:

  • 从托管堆(managed heap)中分配指定类型所需数量的字节来作为存储其对象的内存空间。
  • 初始化对象的附加成员(overhead members)。每一个对象实例都有两个附加成员。其中第一个成员为指向类型方法表的指针,第二个成员为SyncBlockIndex(译注:CLR使用该字段来进行线程同步控制。该字段的某些位还用作垃圾收集时的标记。另外FCL中System.Objec类型默认的 GetHashCode 方法也用到了该字段)。CLR使用这两个成员来管理对象实例。
  • 传入 new操作符中指定的参数,调用类型的实例构造器。虽然大多数语言在编译构造器时都会要求它们调用基类型中相应的构造器,但CLR本身没有这样的要求。

        在new完成所有这些操作后,它将返回一个指向新创建对象的引用。在上面的例子中,该引用被保存在变量e中,其类型为Employee。
        顺便说一句,没有和 new操作符对应的 delete 操作符。也就是说,在 CLR中,我们无法显式释放对象所占用的内存。CLR引入一种垃圾收集环境(将于第19章讨论)来自动检测那些不再被使用或访问的对象,并自动释放它们的内存。

4.2 类 型 转 换

        CLR最重要的一个特性就是类型安全。CLR在运行时总能知道一个对象的类型。我们也可以通过调用 GetType方法来得到对象的准确类型。因为该方法是一个非虚方法,所以我们不可能利用它来篡改一个类型的信息。例如,我们不可能重写Employee类的 GetType 方法使之返回一个 SpaceShuttle类型。

        开发人员经常会发现需要将一个对象转换为其他类型。CLR允许我们将对象转换为其原来

  • 24
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜飞鼠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值