类型基础1 new操作符MyClass c=new MyClass()new运算符背后完成的工作如下:1) 计算该类及其所有基类中定义的所有实例字段(注意有两个隐藏成员,一个是类型对象指针,一个是同步块索引)需要的字节数2) 从托管堆中分配内存,所有字节都设为03) 初始化两个隐藏成员4) 调用基类构造方法,然后调用类的构造方法5) 返回对象的引用(某块内存的别名)
2 类型转换调用对象的GetType()方法可以得到对象的类型,这个方法是非虚的(即不能被子类重写)所以类型是不能被伪装的
关于类型转制隐式转换:子类对象可以隐式转换成基类对象即 Father f=new Child() -----注意Child类继承自Father类显示转制:当两种类型不是这种关系则要显示类型转换,Mather m=(Mather)(new Father()) ---即为(要转换成的类型)要转制的对象,由于显示转换不成功会抛异常,所以转换前最好要进行判断。
这时is和as操作符就上场了(它们是不会抛异常的)
is 判断一个对象是否兼容于指定类型,返回bool结果Father f=new Fahter();bool result=f is Mather();如果 f为null或者对象不兼容于指定类型则返回null,否则为返回true
as 强制对象转制为指定类型对象,不能转换则返回nullFather f=new Father();Mather m=f as Mather();
两者有什么区别呢
假如
Father f=new Fahter();Mather m=new Mather();
1) if( m is Father){ f=(Fahter)m;}
2) f=m as Fahter;
上面就是不同的地方了,在2)的地方,如果转换不成功,f为null,只要判断f是否为null即可继续后面的其它操作而1)在if的时候会判断一下,当它true时执行显示转换时,显示转换还会再进行内部的判断,于是就要做两次判断可想而知,当然是第2种效率高啦
3 命名空间命名空间的作用就是为了防止类的重名,在不同的命名空间里的类是可以重名的,这样就不用想太多的类名了(其实当程序编译的时候,这个地方还是挺复杂的,想了解的话就去看书吧)
程序集与命名空间的关系多对多的关系(一个程序集中可以有多个命名空间,一个命名空间可以在多个程序集中)
4 运行时的相互关系clr via c# 书中的这个地方我觉得看这里会让人不解,最好就是结合视频看,视频就看马sir的java部分(汗!看java的,但真的一样可以用来解释.net)