此外,C#语言还把变量分为值类型和引用类型。除非是被包含在一个引用类型中,值类型变量的值保留在栈中,这一点和C 中的变量很相似。引用类型的变量也是栈的一种,他的值是堆中对象的地址,和C 中的指针很地相似。值类型变量的值被直接传递给方法,引用型变量在被作为参数传递给方法时,传递的是索引。
类和界面能够创建引用类变量,但需要指出的是,结构数据类型是C#的一种内置数据类型,同时也是一种值型的数据类型。
错误4:注意隐性的数据类型转换
Boxing和unboxing是使值型数据类型被当作索引型数据类型使用的二个过程。值型变量能够被包装进一个对象中,然后再被解包回值型变量。包括内置数据类型在内的任何C#中的数据类型都能够被隐性地转化为一个对象。包装一个值型变量就会生成一个对象的实例,然后将变量拷贝到实例中。
Boxing是隐性的,假如在需要索引型数据类型的地方使用了值型数据类型的变量,值型变量就会隐性地转化为索引型数据类型的变量。Boxing会影响代码执行的性能,因此应当尽量避免,尤其是在数据量较大的时候。
假如要将一个打包的对象转换回原来的值型变量,必须显性地对他进行解包。解包需要二个步骤:首先对对象实例进行检查,确保他们是由值型的变量被包装成的;第二步将实例中的值拷贝到值型变量中。为了确保解包成功,被解包的对象必须是通过打包一个值型变量的值生成的对象的索引。
usingSystem;
publicclassUnboxingTest
{
publicstaticvoidMain()
{
inti=123;
//打包
objecto=i;
//解包(必须是显性的)
intj=(int)o;
Console.WriteLine("j:{0}",j);
}
}
假如被解包的对象是无效的,或是个不同数据类型对象的索引,就会产生InvalidCastException异外。



