CLR vir C# 之类型基础
所有的类最终都继承与System.Object
所以在继承类中都会拥有Object的实例方法:
1.Equals
2.GetHashCode
3.ToString
4.GetType
5.MemberwiseClone.
6.Finalize
其中ToString() 借助工具Reflector,可以看出其在Object中的定义:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
可以看出,默认情况下,如果对类型进行 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,不会报错。典型用法:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
这其中涉及两次类型检测:is操作符进行一次,在显式转换时,CLR再次检查一次。存在性能损失
比较简单快捷的方式的是使用as操作符。
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
这里只会在as操作时,进行类型检测, 如果不符,返回null。在if语句中,只是对是否为null的检测,要快捷的多。
命名空间和Assembly
命名空间和Assembly不存在一一对应关系。
采用using进行命名空间的简写。实际的操作,进行的类的全称作业。
注意采用别名避免类名冲突。