《CLR via C#》Part2之Chapter4 类型基础(二)
类型转换
CLR最重要的特性之一是安全性,在运行时,通过调用GetType(),总是知道一个对象的确切类型。
CLR允许将一个对象转换为它的实际类型或者它的任何基类型。Eg: C#可直接将一个对象转换为它的任何基类,因为向基类转换被认为是一种安全的隐式转换。但是将对象向它的某个派生类转换时,C#要求必须显示转换,因为这种转换可能在运行时报错。
类型伪装是去多安全漏洞的根源。
在C#中还有is和as两种转换方式:
- is转换:is检查一个类型是否兼容于指定的类型,并返回一个Boolean值。(is操作符永远不会抛出异常,只会返回ture or false)
1: Object o = new Object;
2: Boolean b1 = (o is Object);//return ture
3: Boolean b2 =(o is IsaacType);//return false
- as转换:C#专门提供as操作符,目的是为了简化转换形式,并提高性能。
1: //is的使用形式2: if(o is IsaacZhang)3: {
4: IsaacZhang isaac = (IsaacZhang)o;
5: //开始使用isaac6: }
7: //as的使用形式8: IsaacZhang isaac = o as IsaacZhang;9: if(isaac!=null){10: //使用isaac11: }
在使用as的形式,如果o不兼容IsaacZhang类型,将返回一个Null;因为使用as操作符,CLR只会校验一次对象的类型,所以性能有所提升。
命名空间和程序集
在C#中我们使用using引入命名空间,但是CLR并不知道命名空间的任何事,访问一个类型时,CLR需要知道类型的完整名称(长的、包括句点符号的名称)以及该类型的定义具体在哪个程序集中。
默认情况下,C#编译器会自动在MSCorLib.dll程序集中查找“引用的类型”,即使你没有显式的告诉它。MSCorLib.dll包含了所有核心Framework类库(FLC)类型的定义,比如Object、Int32、String等。
有时候,为了消除歧义,必须显示的告诉编译器要创建的是哪一个类型
1: //Isaac.Test中包含一个IsaacZhang类型
2: //Isa.Common中也包含一个IsaacZhang类型
3: using Isaac.Test;
4: using Isa.Common;
5:
6: public sealed class Program{
7: public static void Main(){
8: Isaac.Test.IsaacZhang isaac = new Isaac.Test.IsaacZhang;//无歧义
9: }
10: }
C#的using还支持使用别名的形式引用命名空间。如:using alias = Isaac.Test;
C#还提供了一个名为“外部别名(extern alias)”(外部别名甚至还允许从同一个程序集中的不同版本访问一个类型)
运行时的相互联系
这一节解释类型、对象、线程栈、和托管堆在运行时的相互关系。此外,还将调用静态方法、实例方法和虚方法的区别。
下图展示了CLR的一个Microsoft Windows进程。
在这个进程中,可能存在多个线程。一个线程创建时,会分配到一个1M大小的栈,这个栈的空间用于向方法传递参数。
M1方法开始执行时,在线程栈上分配局部变量name的内存,如下图:
然后M1调用M2方法,将局部变量作为一个实参来传递,这造成name变量的地址被压入栈,如下图:
M2方法内部的代码开始执行前,为length和tally分配内存,然后执行代码,当M2执行到return语句,造成CPU的指令指针被设置成栈中的返回地址。如下图:
最终,M1会返回到它的调用者。
[奔跑的人生] | [segmentfault] | [spring4all] | [csdn] | [掘金] | [OSChina] | [简书] | [知乎] | [51CTO]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?