通过学习深入理解C#这本书,发现自己对于C#这门语言一直存在着三个误区。
第一个误区:结构是轻量级的类:
我一直认为值类型不应该具有方法或其他有意义的行为,它们只应该具有一些简单的属性。但书中总结了一个反例DateTime类型,DateTime是值类型,,它理应被赋予对它的值进行计算的能力。总之,值类型和引用类型具体如何决定,应取决于需要的值类型的语义,而不是取决于这个类型的简单与否。
第二个误区:引用类型在堆上,值类型在栈上:
引用类型的实例总是在堆上创建的,这句话是正确的,但是值类型总是在栈上创建的,就有问题了。假定有一个类,这个类中有一个int类型的实例变量,那在这个类的任何对象中,这个int变量的值总是和对象中的其他数据在一起,也就是堆上。
第三个误区:对象在C#中默认是通过引用传递的:
引用类型变量的值是引用,而不是对象本身,不需要引用传递参数本身,就可以更改该参数引用的那个对象的内容,如下面的这个小例子:
void AppendHello(String builder)
{
builder.append("hello");
}
调用这个方法时,参数值(对某StringBuilder的一个引用)是以值传递的方式传递的。
在C#中,无论是引用传递还是值传递,对象本身永远不会被传递,涉及到一个引用类型时,要么是以引用类型来传递变量,要么是以传值的方式来传递参数值引用。