男人.No boy no cry

彪悍的人生,不需要解釋...

导航

C#中的值与引用

Posted on 2005-04-21 13:34  Piccolo Goo  阅读(486)  评论(0)    收藏  举报

C#中的值与引用

一、值类型与引用类型

值类型: 其值就代表了数据本身。

引用类型:其值代表了一个内存地址,该地址处存的真实数据,类似于指针(比指针更安全),就好像是一张识别卡,有了这张识别卡就可以在HR那里找到对应的员工数据。(识别卡也是一个实际的物体,但它上面有工号,同样引用也是一个数值,但这个数值就好像工号,表示了真正数据的地址信息。类似于通过识别卡上的工号到HR查询员工数据一样,系统也实际上是通过引用所表示的内存地址去找到实际的数据)

 

值类型:

l          shortintlongboolchar等原类型(注意没有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处根本不存在的,那么你可以骗过警卫(编译器),并且顺利通过识别卡上是否有工号的判断,但是在大餐厅里刷仍然会出现异常。

然而在C#里引用则保证了所指向的内存地址处一定有合法数据,即语言机制本身保证了每一张有“工号”的“识别卡”上面的“工号”都一定在“HR”处存在并合法。(连系C#的内存释放机制,这一点保证是怎么做到的就很容易理解了)