C#中的值与引用
一、值类型与引用类型
值类型: 其值就代表了数据本身。
引用类型:其值代表了一个内存地址,该地址处存的真实数据,类似于指针(比指针更安全),就好像是一张识别卡,有了这张识别卡就可以在HR那里找到对应的员工数据。(识别卡也是一个实际的物体,但它上面有工号,同样引用也是一个数值,但这个数值就好像工号,表示了真正数据的地址信息。类似于通过识别卡上的工号到HR查询员工数据一样,系统也实际上是通过引用所表示的内存地址去找到实际的数据)
值类型:
l short、int、long、bool、char等原类型(注意没有string)
l 枚举类型(enum),例如DateTime
l 结构体(struct)
引用类型:
l 类(包括string)
l 数组
l 接口
l 委托
Demo:
object test1 = null; // 申明(创建)了一个引用,但没有真实数据(相当于一张没有工号的识别卡)
test1 = new object(); // 1.首先用new在内存里创建实际的数据 2.然后将数据地址赋给引用test1
// (相当于先在HR那创建员工信息,然后把工号写到先前制作好的空识别卡上)
object test2 = new object(); // 在制作识别卡的同时就把员工信息创建了,并把工号写到识别卡上
Case:
object test1 = null;
string temp = test1.ToString();
上面的代码编译可以通过,但是运行时会报“未将对象引用设置到对象的实例”,就好像你拿了一张没有工号的识别卡,可以骗过警卫(编译器),但是你拿到大餐厅里刷就会出现异常(运行时错误)。
(所以为了程序的健壮性,当在不能确定一个引用是否一定有设置对象实例时,应该首先进行判断if(test != null),判断成功然后再调用相应的对象方法和属性,以避免运行时的异常)
引用比指针更安全:
(1)、指针本身是一个整形数值,这个数值表示了真实数据的内存地址。关键是这个数值是暴露出来的,那么就可以获得数值后作运算(比如指针做加减)来得出新的内存的地址,从而可能访问到不该访问的数据。而引用则是将所指向内存地址这个数值作了包装,不能获得该数值,从而也无法作运算,保证了内存中数据的安全性。
(2)、指针本身有一个数值,但是该数值所代表的内存处的数据可能并不是合法的(并不是你所想那样的数据),那么使用该指针就会出现运行时错误,所以即使你在指针使用前先进行了是否为null的判断,但是这个指针仍然可能是有问题的。就好像有一张识别卡,并且上面有工号,但是这个工号却是不合法的,在HR处根本不存在的,那么你可以骗过警卫(编译器),并且顺利通过识别卡上是否有工号的判断,但是在大餐厅里刷仍然会出现异常。
浙公网安备 33010602011771号