C# 引用类型、值类型与拆箱、装箱
2016-03-04 20:59
344 查看
引用类型 任何可被称为‘类’的类型 如:System.Exception, System.IO.FileStream,
[b][b]System.[/b]String
[/b]
值类型 被称为结构或枚举的类型 如:System.Int32, [b]System.Boolean,
System.Decimal,
[/b]
[b]System.TimeSpan, System.DayOfWeek,
System.IO.FileAttributes, System.Drawing.FontStyle
[/b]
拆箱 将值类型转化为引用类型
装箱 将引用类型转化为值类型
{
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
}
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();
}
[b][b]System.[/b]String
[/b]
值类型 被称为结构或枚举的类型 如:System.Int32, [b]System.Boolean,
System.Decimal,
[/b]
[b]System.TimeSpan, System.DayOfWeek,
System.IO.FileAttributes, System.Drawing.FontStyle
[/b]
拆箱 将值类型转化为引用类型
装箱 将引用类型转化为值类型
引用类型、值类型示例
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();
}
相关文章推荐
- C#中,带关键字的按页获取查询,这是部份代码,但可以看出大概实现方式
- c# 动态设置控件位置
- C#中list<T>性能内存优化分配,Capacity设置
- c# Chart 服务器端动态创建ChartArea
- C# Chat曲线图,在发布之后出现错误 Invalid temp directory in chart handler configuration c:\TempImageFiles\
- C#中List的浅复制和深复制
- C# 如何生成一个时间戳
- Socket通信实例
- 骑士飞行棋 C#代码详解
- C# 3的分部方法
- 谈C#中的Delegate
- c# getipv4
- c# 照片轮播控件
- c#获取客户端信息
- 从0自学C#07--螺旋队列和螺旋运动
- C#之事件
- C#之委托
- C# 编写Web API
- 【笔记】《C#大学教程》- 第5章 控制结构(二)
- 值参数与引用参数(C#)