类型可以分为两类:引用类型和值类型。
值类型:
值类型直接包含值,变量引用位置就是值在内存中实际存储的位置。需要的内存会在编译时固定下来,不会在运行时改变。因为大小是固定的,所以值类型可以存储在称为stack的内存区域。
引用类型:
引用类型和引用它们的变量指向数据存储位置,引用类型存储的是对一个内存位置的引用(内存地址),要去那个位置才能找到真正的数据。引用类型指向内存的区域称为堆(heap)。
两者比较:引用类型比值类型速度慢,利用率好,更有效。
在C#中除了string和object所有的类型都是值类型。
struct的初始化
struct可以包含属性、字段、方法和构造器,不能包含默认(无参数)的构造器。
C#禁止用户显式定义默认构造器。
C#禁止在声明时对实例字段进行赋值。如下:声明的同时初始化struct的一个字段会造成错误
struct Angle { int _Hours = 42; }
C#支持带参数的构造器,但必须对struct中的所有字段进行初始化。
struct不支持终结器
default运算符的使用
指定一个特定类型的默认值。
//用default运算符来获取某个类型的默认值 struct Angle { public Angle(int hours, int minutes) :this(hours, minutes, default(int)) {} }
值类型的继承和接口
装箱
定义:从一个值类型转换成它实现的某个接口或者它的根基类object,这样的转型过程称为装箱。
装箱过程, 涉及以下几个步骤:
(1)在堆中分配好内存;
(2)接着发生一次内存复制动作,栈上的值类型数据复制到堆上分配好的位置;
(3)最后,对象或接口引用得到更新,指向堆上的位置;
枚举
枚举不能是char类型
枚举转换为基础类型以及从基础类型转换为枚举类型都涉及显式转型,而不是隐式转型。(存在从0到任何枚举的隐式转换)
原文:http://www.cnblogs.com/AngelAI/p/3928358.html