现在的位置: 首页 > 综合 > 正文

c# 学习–类型基础

2012年10月16日 ⁄ 综合 ⁄ 共 1053字 ⁄ 字号 评论关闭

类型基础
1 new操作符
MyClass c=new MyClass()
new运算符背后完成的工作如下:
1) 计算该类及其所有基类中定义的所有实例字段(注意有两个隐藏成员,一个是类型对象指针,一个是同步块索引)需要的字节数
2) 从托管堆中分配内存,所有字节都设为0
3) 初始化两个隐藏成员
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 强制对象转制为指定类型对象,不能转换则返回null
Father 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)

抱歉!评论已关闭.