值类型:byte short/char int long float double decimal bool enum
特点:在进行赋值的时候传的是数值,修改其中任意一个数据变量时,另一个不会受到影响。
例如:
int a=12; int b=a; b++; Console.WrithLine("${a} {b}"); //a=12,b=13
引用类型:string object array
特点:在赋值过程中,传递的是地址
int[] arr={1,2,3,4,5}; int[] arr2=arr; arr[0]=22; Console.WriteLine("${arr[0]} {arr2[0]}"); //输出 arr[0]=22,arr[2]=22
值类型:可以这么理解:A,B变量分别是两个不同的空间。给定A变量赋值为 2 ,给定B变量也赋值为 2。现在,修改A变量值为 3,B变量不会发生改变,也就是说B变量开辟的空间不受A变量影响,各司其职。。。
引用类型:拿数组举例,A为数组开辟了一个空间,1,2,3分别是数组元素。
这时候B指向数组A,不管是数组还是对象,都需要通过关键字new再去开辟另一个空间,但是,这里B指向了数组A,此时当数组A里面的元素发生改变时,B必然也会发生改变,因为此时B并没有单独开辟空间,它还是指向了数组A。。。
万物都有它的源头。。。在程序中也适用。。。也就是里氏替换原则。
里氏替换原则:父类型变量可以装子类型的对象。
那就是 Object,可以说是他们的“祖宗”
object obj=1;//整型 obj="abc";//字符串 obj=new int[]{1,2,3};//数组
以上操作可以称为封装操作。
封装操作:把值类型转换成引用类型,装箱操作。虽然这个包箱是引用类型,但是箱子里面的值依然是值类型。但是一旦进行了装箱操作,就无法直接使用里面的值。
打个比方理解:比如说出去买啤酒,但是这瓶啤酒外面包了一层箱子,显然是无法直接喝的。需要把这个箱子拆开,把里面的酒拿出来。也就是说我们需要进行拆箱操作。
拆箱操作:把引用类型装换为值类型,拆箱操作。实际上在装箱时底层调用了一个inbox方法,拆箱时,调用unbox方法。
例如:
int a=(int) obj;
这时就被拆掉了。