类型和变量这一块内容挺多额,好像昨天面试的时候被面试到了,忘了(好糗!)
C#里有两种类型:
值类型(value types):
a,值类型的变量直接包含它们的数据
b,每个变量拥有自己的副本,所以对其操作不会影响另一个(except ref 和 out 参数变量)。
引用类型(reference typeset):
a,引用类型的变量保存的是它们对数据的引用,也成为对象。
b,两个变量完全可能引用同一个对象,所以对一个变量的操作会影响另一个引用此对象的变量。
误区:值类型存储在”栈“中,引用类型存储在”堆“中。(来自ERIC LIPPERT的分析)
解释:a,这只描述了两种类型运行时实现细节的差别,并非关于语言本质的差别。
b,本身不正确,与引用类型相关联的数据的确存储在堆中,但这些数据也可能包含值类型的实例,因此值类型也可能存储在堆中。
真正的区别:值类型是按值复制而引用类型仅仅复制引用。
C#的类型系统:
值类型:
简单类型(Simple):带符号整数,无符号整数,Unicode字符,IEEE标准浮点数,高精度数值,布尔值
枚举类型(enum)
构造类型(struct)
空属类型(nullable)
引用类型:
类类型(class)
接口类型(interface)
数组类型(array)
委托类型(delegate)
补充:
(来自CHRISTIAN NAGEL)
C++程序所面临的一个问题是,规范中没有定义short,int,long类型数据所占的字节个数,导致在16位,32位,64位机器上占用不同的字节空间。
而C#则明确规定了数值类型数据的长度,该长度与平台无关。