基本概念
在C#中,所有的类型都直接或间接地继承自 System.Object
,也称为“万物之父”。这意味着每个类型都具有 Object
类的基本方法,如 ToString()
、Equals()
、GetHashCode()
和 GetType()
。
用途
统一类型体系:使得所有类型都可以被视为
Object
类型,从而提高了语言的一致性和灵活性。多态性:可以将不同类型的对象存储在同一个集合中。
通用方法:提供了一组通用的方法,如
ToString()
、Equals()
等,可以对所有对象调用。
在游戏开发中,Object
可以用于创建统一的对象管理系统,处理各种类型的游戏对象。
语法规则
所有类型都隐式地继承自 Object
类,无需显式声明。
public class MyClass
{
// MyClass 隐式继承自 Object
}
public class Program
{
public static void Main()
{
MyClass obj = new MyClass();
Console.WriteLine(obj.ToString());
}
}
装箱和拆箱
基本概念
装箱(Boxing):将值类型转换为引用类型的过程。例如,将一个 int
类型转换为 object
类型。装箱会在堆上分配内存,并将值类型的值复制到新分配的对象中。
拆箱(Unboxing):将引用类型转换回值类型的过程。例如,将一个 object
类型转换为 int
类型。拆箱会将堆上的对象值复制回栈上的值类型变量中。
用途
类型转换:装箱和拆箱允许值类型与引用类型之间的转换。
集合类:在使用如
ArrayList
等不支持泛型的集合类时,装箱和拆箱是不可避免的。
在游戏开发中,装箱和拆箱可以用于处理不同类型的数值和对象,如在物理计算和游戏状态管理中。
语法规则
装箱:
int x = 123;
object obj = x; // 装箱
拆箱:
object obj = 123;
int x = (int)obj; // 拆箱
示例代码
装箱和拆箱示例
public class Program
{
public static void Main()
{
int value = 123;
object obj = value; // 装箱
int newValue = (int)obj; // 拆箱
Console.WriteLine(newValue); // 输出: 123
}
}
优点和缺点
优点
灵活性:装箱和拆箱提供了值类型和引用类型之间的灵活转换。
统一处理:可以将不同类型的对象统一处理,如在集合类中。
缺点
性能开销:装箱和拆箱会导致额外的内存分配和复制操作,影响性能。
类型安全:拆箱时需要显式类型转换,可能导致运行时错误。
基础练习题
创建一个
ArrayList
,添加不同类型的值(如int
、double
、string
),并从集合中取出这些值进行相应的类型转换。创建一个自定义类,重写
Object
类的ToString()
方法,返回类的详细信息。在Main
方法中实例化该类并调用ToString()
方法。
进阶练习题
实现一个通用的集合类(如
MyList
),使用object
类型存储不同类型的值,并实现装箱和拆箱操作。确保集合中的值可以正确存储和提取。创建一个包含不同游戏对象的集合类(如
GameObjectCollection
),并使用装箱和拆箱操作处理这些对象。在Main
方法中,添加不同类型的游戏对象,并从集合中提取这些对象进行操作。