C# 数据类型分为两种 "非常重要"
- 值类型
- 引用类型
从概念上来看,其区别是值类型直接存储其值,而引用类型存储对值的引用。
这两种类型存储在内存的不同地方:
- 值类型存储在 堆栈(stack)中
- 而引用类型存储在托管堆(managed heap)上
注意区分某个类型的值类型还是引用类型,因为这会有不同的影响。
例如 int 是值类型, 这表示下面的语句会在内存的两个地方存储值20:
i = 20;
j = i;
我们来看看下面的代码, 这段代码假设已经定义了一个类 Cat , Cat是一个引用类型, 它有一个 string 类型的成员变量 Name:
Cat whiteCat, blackCat;
whiteCat = new Cat();
whiteCat.Name = "白猫";
blackCat = whiteCat;
Console.WriteLine(blackCat.Name);
blackCat.Name = "黑猫";
Console.WriteLine(whiteCat.Name);
要理解的重要一点是在执行这段代码后, 只有一个 Cat对象。 whiteCat 和 blackCat 都指向包含该对象的内存位置。
因为 whiteCat 和 blackCat 是引用类型的变量, 声明这两个变量值保留一个引用 。如上所示。 因为 whiteCat 和 blackCat 引用
同一个对象,所以对 whiteCat的修改会影响 blackCat, 反之亦然。 因此上面的代码会显示 白猫 和 黑猫
如果变量是一个引用, 就可以把其值设置为 null, 表示它不引用任何对象:
whiteCat = null;
如果将引用设置为null, 显然不能再对它调用任何非静态成员函数或字段了。