C#值类型 引用类型区别示例
C#值类型 引用类型区别示例
值类型通常被分配在堆栈上,引用类型总是分配在托管堆上,引用类型的变量通常包含一个指向实例的指针,变量通过该指针来引用实例,下面是在书上看到的一个例子,能说明白这两种类型的不同。
public partial class _Default : System.Web.UI.Page
{
//<summary>class是引用类型</summary>
public class RefType
{ public int Var; }
//<summary>struct是值类型</summary>
public struct ValueType
{ public int Var; }
//<summary>TestValueRef测试了值类型和引用类型之间的差别</summary>
private void TestValueRef()
{
RefType reft = new RefType();//定义了引用类型的实例对象
ValueType valuet = new ValueType();//定义了值类型的实例对象
reft.Var = 100;//赋值
valuet.Var = 100;//赋值
Response.Write("RefType:Var=" + reft.Var.ToString() + "<br>");//输出
Response.Write("Valuet:var=" + valuet.Var.ToString() + "<br>");//输出
//<summary>赋值给新的实例对象</summary>
RefType refto = reft;
ValueType valueo = valuet;
//<summary>给新的实例对象赋值</summary>
refto.Var = 10;
valueo.Var = 1000;
//<summary>此时的refto.Var=10,托管堆上的Var=10,reft和refto都指向同一个地址,所以他们的值都是一样的,而值类型的valuet和valueo都存在堆栈中,并且值都没有改变</summmary>
Response.Write("RefType:Var修改之前="+reft.Var.ToString()+"<br>");
Response.Write("RefType:Var修改之后=" + refto.Var.ToString() + "<br>");
Response.Write("Valuet:var修改之前="+valuet.Var.ToString()+"<br>");
Response.Write("ValuetVar修改之后="+valueo.Var.ToString() + "<br>");
}
protected void Page_Load(object sender, EventArgs e)
{
TestValueRef();
}
}
结果:
RefType:Var=100
Valuet:var=100
RefType:Var修改之前=10
RefType:Var修改之后=10
Valuet:var修改之前=100
ValuetVar修改之后=1000