CLR通过C#探索:类型基础与对象创建解析

1 下载量 9 浏览量 更新于2024-08-29 收藏 459KB PDF 举报
"带着问题了解CLR通过C#学习的笔记,主要关注类型基础" 在深入探讨.NET框架的公共语言运行库(CLR)以及C#编程语言时,了解对象和类型的本质至关重要。本文笔记主要讨论了Object类型的方法、创建新对象的过程以及类型间的转换。 首先,我们来看Object类型,它是所有其他类型的基类,它包含了六个基本方法: 1. **Equals**:用于比较两个对象是否相等,可以重写以实现自定义的相等比较。 2. **GetHashCode**:返回对象的哈希码,通常用于哈希表的快速查找。 3. **ToString**:返回表示当前对象的字符串,子类可重写以提供更具描述性的输出。 4. **GetType**:返回对象的类型信息,即System.Type对象。 5. **MemberwiseClone**:创建当前对象的一个浅复制,仅复制实例字段,不复制引用对象。 6. **Finalize**:对象析构前执行的方法,用于释放非托管资源,但并不保证在垃圾回收之前调用。 创建新对象的过程涉及以下步骤: 1. **计算大小**:确定对象所需内存大小,包括实例字段、类型指针和同步块索引。 2. **分配内存**:在托管堆上分配内存空间。 3. **初始化**:设置类型对象指针和同步块索引,这两个是CLR用于管理对象的元数据。 4. **构造函数调用**:执行构造函数,初始化实例字段。子类构造函数会先调用基类构造函数。 5. **返回引用**:返回对新建对象的引用,供程序使用。 举个例子,创建一个类层次结构,包括Test、TestTwo和TestThree,当创建TestThree对象时,会依次调用三个类的构造函数,确保所有实例字段被正确初始化。 关于类型转换,C#支持两种转换方式: 1. **向上转型(Upcasting)**:父类型到子类型的转换是隐式的,安全的,因为子类型总是包含父类型的所有成员。 2. **向下转型(Downcasting)**:子类型到父类型的转换需要显式进行,因为这可能导致类型不匹配的错误。只有当实际对象确实为转换的目标子类型时,转换才会成功,否则会抛出InvalidCastException。 例如,我们可以将一个Man对象转换为Person对象(向上转型),但如果试图将Person对象转换回Man(向下转型),则需要显式转换,并且只有在Person对象实际上是Man实例时才能成功。 理解这些基本概念对于理解和编写高效的.NET代码至关重要,因为它们涉及到类型系统的核心机制,包括对象的创建、类型转换和对象生命周期的管理。掌握这些知识可以帮助开发者更好地利用CLR和C#的特性,提高代码的可靠性和性能。