象的)方法的实现,事实上,valuetype定义的实例方法和由object定义的完全相同。由于值类型使用基于值的语法、结构,生命期可以预测,当离开定义域的范围,他就立刻从内存中移除。当用赋值运算符(=)将一种类型赋值给另外一个时,有两种情况:将一个值类型赋值给另外一个时,对字段成员逐一进行复制(对于int这样简单类型,唯一需要复制的成员就是数值,对于结构,如上point,则a,b的值都会被复制到新的结构变量中。)栈上会有这个类型的两个副本,每个都被独立操作,一个的变化,不影响另外一个。将一个引用类型赋值给另外一个时,在内存中重定向引用变量的指向。两个引用指向托管堆中的同一个对象,因此,其中一个的改变,同时会影响另外一个。包含引用类型的值类型:若在一个值类型中包含引用类型,比如结构中有一个类类型,则将这个结构赋值给另外一个时,将会把结构中值类型进行赋值,而将结构中的引用进行复制,因此,更改结构中的值类型不影响另外一个,而两个结构中的类其实是引用一样的,改变其中一个,必然影响另外一个结构中的类。这就是所谓的“浅复制”,还有一种称为“深复制”,即将内部引用的状态完全复制到一个新的对象中去,需要实现ICLoneable结构,之后的篇章中会讲到。按值传递和按引用传递引用类型:本章一开始就说了参数又四种类型,其中就有按值传递(无修饰符)和按引用传递(ref和out),前面说过对于一个值类型用引用传递来修饰没有任何意义,虽然不会报错,但是和按值传递没有区别,不会真的改变值类型的值。但是,对于引用类型,采用值传递和引用传递,效果是不同的!按值传递一个引用类型(如person)时,如:staticvoidsend(personp){p.age=99;//这句是有效的p=newperson("lee",99);//这句是无效的}按引用传递一个引用类型(如person)时,如:staticvoidsend(refpersonp){p.age=99;//这句是有效的p=newperson("lee",99);//这句是有效的}前者类似于p是一个常量指针,可以访问和修改它指向的对象,但是不能更改它的指向(new)。后者类似于可变的指针,可以访问和修改它指向的对象,也可以更改它的指向,使之重新指向另外一个对象。这个区别是在之前所有书籍中都没有介绍过的!!再简单总结一下一些遗漏的值类型与引用类型的区别:前者不能被继承,后者可以;前者默认构造函数是系统提供的,用户不能自定义一个没有参数的构造函数,后者当然可以。4.6可空类型.NET2.0发布后,支持一种可空类型。它就是可以表示所有基础类型的值加上null,为了定义一个可空变量类型,应在底层数据类型中添加问号(?)作为后缀进行声明。注意,这种类型只对值类型合法,定义一个可空引用类型是不合法的(引用类型本身就可以为null!)定义方法:int?a=10;int?[]b=newint?[5];Nullable
c=10;publicint?getsomething()
{}注:?后缀记法是创建一个泛型system.nullable的缩写。可以功过