4.1 所有类型的基础System.Object
CLR要求每个类型最终都要继承自System.Object。这意味着下面两种类型定
义是等同的:
//隐式继承Object
class Employee
{
}
//显式继承Object
class Employee : System.Object
{
}
因为每个类型最终都会继承自System.Object,所以我们可以确保任何对象都
有一组方法的最小集合:
System.Object的公有方法
公有方法 |
描述 |
Equals |
|
GetHashCode |
|
GetType |
|
ToString |
默认情况下,该方法返回类型全名(this.GetType().FullName.ToString()),但是,还有一种常见的做法是重写该方法使其返回一个表示对象状态的字符串。 |
System.Object的受保护的方法
受保护的方法 |
描述 |
MemberwiseClone |
|
Finalize |
这是个虚方法,当垃圾收集器判定某个对象为可回收的垃圾时,垃圾收集器会在对象内存被回收之前调用此方法。那些内存回收时需要清理资源的类型应该重写该方法。 |
4.2 类型转换
CLR最重要的一个特性就是类型安全。CLR在运行时总能知道一个对性的类
型。 CLR允许我们将对象转换为其原来的类型或者它的任何一个基类型。在C#
中,我们可以隐式的将一个类型转换为其任何一个基类型,然而要将对象转换
为它的任何派生类型时,C#要求进行显式转换。例如:
class Employee
{ }
//这里不需要转换,因为object是Employee的基类型
object o = new Employee();
//这里需要转换
Employee ex = (Employee)o;
上面的例子显示了我们要使代码通过编译需要做的事情,下面我们解释运行时
发生的事情:
下面的代码虽然能通过编译,但是在运行时却会抛出InvalidCastException
异常:
class Manager : Employee
{ }
void Promote(Object employee)
{
Employee ex = (Employee)employee;
}
Manager man = new Manager();
Promote(man);
DateTime dt = DateTime.Now;
Promote(dt);
4.3 使用IS和AS操作符转型
C#提供了一种利用IS操作符进行转型的方式,它检查给定的对象是否和给定的
类型兼容,并返回True或False。另外,IS永远不会抛出异常。
if (o is Employee)
{
Employee e = (Employee)o;
}
在上面的代码中,CLR实际上对对象的类型检查了两次:is操作符首先检查兼
容性,如果兼容了,在if语句内部,CLR在执行转型时又检查了一次。所以C#
提供了另外一种新的转型方式,即as操作符:
Employee ex = o as Employee;
if (e != null)
{
}
在上面的代码中,CLR会检查o与Employee是否兼容,不兼容会返回null,而
判断e是否为null比兼容性检查高效的多,所以这种方式提高了效率。同样,
as也不会抛出异常。