C# via CLR(4)-------类型基本原则(Type Fundamentals)

   最近闲来无事,发现桌上有一本厚厚厚厚的CLR via C#还没有看,美国原版,59.99刀,于是打算好好深入的温习一下。以备之后有不时之需。700余页,打算把学习的东西都记下来,顺便写2blog当作读书笔记,以免过于的枯燥和无聊。其实很多前辈告诉我,基础还是非常重要的,即便是做了好几年的程序员,基础扎实的也不是很多。。。废话不多说了,起初的3章说的有点泛泛,翻过去回头再说,从第四章开始,Type Fundamentals

·     所有类型都是继承于System.Object(all Types Are Derived friom System.Object)

  运行时需要任何一个类型最终都是继承于System.Object类型的。这个就意味着以下这两种定义是一致的:

  class Employee{...}

  class Employee : System.Object{...}

  正是因为他们都继承于这个公共的类,也就是保证了他们有一个最小的方法集。他们有如下的公共方法:

    Equals 如果两个对象有一样的值,返回true

    GetHashCode :返回对象值的哈希编码。

    ToString :返回(this.GetType().FullName)

    GetType :返回一个Type-derived对象的例子能够识别对象类型用来调用GetType

  还有两个Protected方法:

    Finalize:垃圾回收

    MemberWiseClone :浅拷贝。

      CLR需要所有的对象在创建的时候使用new关键字,如下方式:

  Employee e = new Employee(“ConstructorParam1”);

New关键字创建对象了之后,返回一个引用或者指针到新创建的对象。就像是上面的那个例子一样,返回的引用存在e这个变量中,它是Employee类型的。

      这个new操作法没有可以扩展的delete操作符,也就是说,没有明确如何释放分配了的内存。CLR使用了垃圾回收机制自动的探测,当一个对象不再被使用或者访问,并且自动释放。

Casting Between Types (类型转换)

      CLR最重要的一个特性就是类型的安全,在运行时,CLR总是能够知道一个对象是那种类型的。你总是可以通过GetType方法找到一个对象的类型。因为这是一个非虚的方法,所以他不可能伪装成另一种类型。

      程序员们经常会觉得把对象转换成多种类型是有必要的,CLR允许我盟转换一个对象到它基类型。编程语言的选择也就是暗示了类型转换符有多少暴露出来。比如C#不允许特殊的语法把一个对象转换到它的基类型,因为转换会发生一些安全隐患。然后,C#允许开发人员把对象转换到它继承的类型中去,诚然这样的转换会引运行时的错误。

  Internal class Employee{。。。。}

  Public seal Class Program{

        Public static void mais(){

      Object o = new Emplyee();

      Employee e = Employeeo;

    }

  }

  在运行时,CLR会检查转换类型保证要转换的类型,事实上是不是转换成的那个类型的子类型。

  • C# 中类型转换符 is 和as Casting with the C# is and as Operators

  C#中的另一种类型转换是使用 is 操作符。Is 在转换的时候会检查是否和给定的类型兼容,返回值是一个boolean变量。Is操作符永远不会抛出异常。

    Object o = new Object();

    Boolean b1 = (o is Object); //b1 is true.

    Boolean b2 = (o is Employee); // b2 is false.

  如果对象的引用是nullis 总会返回false.

  Is 通常这样使用

    If (o is Employee) {

    Employee e = (Employee) o;

      }

  在如上的这段代码中,CLR事实上会检查2次类型。Is 第一次检查o是否和Employee兼容。如果是的话,if里面的状态,进行转换的过程中,CLR会再次检查  oEmployee的引用是否正确。CLR的类型检查会提高安全性。C#提供了一个简单的方式使用as操作符:

    Employee e = o as Employee;

    If( e != null)

    {…..}

  在这段代码中,CLR会检查o是不是和Employee兼容的类型,如果是的话,返回非null引用。如果o不和Employee类型兼容,那么返回null。注意,as 操作符一起CLR去检验对象的类型一次。

  As 操作符并不是意味着永远不会抛出异常,相反的,如果对象不能被转换,结果是null如果你想要检查结果的引用是不是null,或者企图使用引用的结果,那么就会引起一个 System.NullReferenceException 异常。如下的代码说明这个问题:

      Object o = new Object();

      Employee e = o as Employee;//o转换成Employee, 这个转换是不会有异常的。

      e.toString();//抛出异常。System.NullReferenceException

  • How Things Relate at Run Time 在运行时事物是如何相关的。

         这个是第二版新增的内容,第一版上面没有。作者画了很多图,内存的图示相互之间的关联,仔细分析之后,奉上精彩内容。(待续。。。。)

posted @ 2008-12-26 15:53  AlexLiu  阅读(513)  评论(0编辑  收藏  举报