CLR vir C# 之类型基础

     所有的类最终都继承与System.Object    

     所以在继承类中都会拥有Object的实例方法:

     1.Equals

     2.GetHashCode

     3.ToString

     4.GetType

     5.MemberwiseClone.

     6.Finalize

      其中ToString() 借助工具Reflector,可以看出其在Object中的定义:
     

Code

     可以看出,默认情况下,如果对类型进行 ToString()操作,返回的将是类型的完整类名。同时它又是一个虚方法,这就使得在我们的类型中,可以对其重写。我们经常进行的对string ,int等的ToString()的操作,实际上执行的就是其重写方法。

     CLR在实例化一个对象时,使用new 关键字如 ClassName myCls=new ClassName("para");其执行的过程为:

     1.计算对象以及其所有的基类的大小,包括“类型对象指针”和“同步块索引”

     2.在托管堆中分配内存

     3.初始化对象”类型对象指针”和“同步块索引”
     4.调用构造函数,并传递参数。构造函数的执行顺序要注意,最终要执行到System.Object的构造函数。

     5.返回对象地址(指针)

     类型转换

     CLR强调类型安全。类型转化时,它会检查对象类型,下面情况下,认为类型安全:

     1.对象转化为其基类。此时为安全隐式转换。

            test t = new test();
            object o = t;

     2.对象转化为与其对应的类型,此时需要显式转换,否则编译期错误

            test t = new test();
            object o = t;

             test t2=(test)o;

     3.从小范围数据向大范围数据类型转换,隐式安全;否则需要显式转换。

     另外,如果进行从继承类到基类的显式转换,编译通过,运行时将出错。

     用is,as进行类型转换

     is运算符,检查对象是否与给定类型一致,返回布尔类型true(false).如果对象为null,返回false,不会报错。典型用法:

     

Code

     这其中涉及两次类型检测:is操作符进行一次,在显式转换时,CLR再次检查一次。存在性能损失

     比较简单快捷的方式的是使用as操作符。

    

Code

     这里只会在as操作时,进行类型检测, 如果不符,返回null。在if语句中,只是对是否为null的检测,要快捷的多。

     命名空间和Assembly

     命名空间和Assembly不存在一一对应关系。

     采用using进行命名空间的简写。实际的操作,进行的类的全称作业。

     注意采用别名避免类名冲突。

posted on 2008-08-28 14:19  easy2Dev  阅读(361)  评论(0编辑  收藏  举报

导航