引用类型 任何可被称为‘类’的类型 如:System.Exception, System.IO.FileStream, System.String
值类型 被称为结构或枚举的类型 如:System.Int32, System.Boolean, System.Decimal,
System.TimeSpan, System.DayOfWeek, System.IO.FileAttributes, System.Drawing.FontStyle
拆箱 将值类型转化为引用类型
装箱 将引用类型转化为值类型
引用类型、值类型示例
class RefSample
{
public Int32 x;
}
struct ValueSample
{
public Int32 x;
}
static void ValueTypeDemo()
{
RefSample r1 = new RefSample(); //在堆上分配
ValueSample v1 = new ValueSample(); //在栈上分配
r1.x = 5; //提取指针
v1.x = 5; //在栈上修改
Console.WriteLine(r1.x); //显示 5
Console.WriteLine(v1.x); //显示 5
RefSample r2 = r1; //复制引用(指针)
ValueSample v2 = v1; //在栈上分配并复制成员
r1.x = 8; //r1.x r2.x都改变
v1.x = 9; //v1.x改变 v2.x不变
Console.WriteLine(r1.x); //显示 8
Console.WriteLine(r2.x); //显示 8
Console.WriteLine(v1.x); //显示 9
Console.WriteLine(v2.x); //显示 5
}
拆箱装箱说明
1. 如果包含‘对已装箱值类型实例的引用’的变量为null, 抛出NullReferenceException异常
static void Main(string[] args)
{
try
{
Int32 temp = 5;
object o = temp;
o = null;
Int32 y = (Int32)o;
}
catch(NullReferenceException ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadKey();
}
2. 如果引的对象不是所需值类型的已装箱实例, 抛出InvalidCastException异常
static void Main(string[] args)
{
try
{
Int32 temp = 5;
object o = temp;
Int16 y = (Int16)o;
}
catch(InvalidCastException ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadKey();
}