【前提】
值类型
整数类型、浮点型(float double)、小数型(decimal)、布尔型(bool)、字符型(char)、结构型(struct)、枚举型(Enum)
引用类型
类:面向对象编程的基本单位,包含数据成员(常量、域、事件)、函数成员(方法、属性、索引指示器、运算器、构造函数、析构函数)、嵌套类型的数据结构。支持集成机制,通过继承,派生类可以扩展基类的数据成员和方法,实现代码重用和设计重用。
委托:引用方法的指针,相当于C++的指针。允许实例化和调用类的静态方法、调用类指定实例的方法,不能有返回值和带输出类型的参数。
接口:包含了方法的数据结构,在代码中调用组件对象功能。成员有:方法、属性、索引指示器、事件。
数组:存储同一类型的参数。描述数组用:数组名、数据元素的类型、维数。
数据转换
隐式转换:系统默认的,从低精度、小范围的数据类型转换为高精度、大范围的数据类型。
显式转换:又称强制转换,需要用户明确地指定转换的类型。
Object类
是所有类型的根,C#中所有类型都直接或间接地从Object类中继承。
【装箱拆箱】
装箱
将值类型转换成引用类型
<span style="font-size:18px;">int num=10;
object obj=num;
Console.WriteLine(obj);
Console.ReadKey();</span>
拆箱
将值类型转换为引用类型,再将引用类型转换成值类型(被装过箱的才可以被拆)
<span style="font-size:18px;">int num=10;
object obj=num;
int number=(int)obj;
Console.WriteLine(obj);
Console.ReadKey();</span>
装箱原因
1.调用一个含类型为Object的参数的方法,该Object可支持任意为型,以便通用。当你需要将一个值类型(如Int32)传入时,需要装箱。
2.一个非泛型的容器,同样是为了保证通用,而将元素类型定义为Object。于是,要将值类型数据加入容器时。
装箱/拆箱内部操作
装箱
对值类型在堆中分配一个对象实例,并将该值复制到新的对象中。第一步:新分配堆内存。
第二步:将值类型的实例字段拷贝到新分配的内存中。
第三步:返回托管堆中新分配对象的地址。这个地址就是一个指向对象的引用了。
拆箱
检查对象实例,确保它是给定值类型的一个装箱值。将该值从实例复制到值类型变量中。 最关键的是检查对象实例的本质,拆箱和装箱的类型必需匹配。