数值类型有值类型和引用类型两种,两种有不同是用法和定义
1、值类型的特点
①所有的值类型都隐式派生自Syste.ValueType
② 基于值类型的变量直接包含值。例如:
int a = 5;
int b = a;
b = 10;
Console.WriteLine(a);
当声明一个值类型的变量a时,这个变量被保存在线程堆栈中,这个时候在线程堆栈中有变量的名称,变量的类型还有变量的值,如果在声明一个变量b,把a赋值给b,此时只是把a的值赋给了b,b同时也在线程堆栈中,包括b的名称、类型和值,当执行第三句话后,b的值变成了10,并不影响a在线程堆栈中的值,所以打印出的a的值仍然是5
③每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。
2、引用类型的特点
①引用类型的变量又称为对象,可存储对实际数据的引用。
② 基于引用类型的变量不直接包含值,它的值存储在托管堆中。例如“
①所有的值类型都隐式派生自Syste.ValueType
② 基于值类型的变量直接包含值。例如:
int a = 5;
int b = a;
b = 10;
Console.WriteLine(a);
当声明一个值类型的变量a时,这个变量被保存在线程堆栈中,这个时候在线程堆栈中有变量的名称,变量的类型还有变量的值,如果在声明一个变量b,把a赋值给b,此时只是把a的值赋给了b,b同时也在线程堆栈中,包括b的名称、类型和值,当执行第三句话后,b的值变成了10,并不影响a在线程堆栈中的值,所以打印出的a的值仍然是5
③每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。
2、引用类型的特点
①引用类型的变量又称为对象,可存储对实际数据的引用。
② 基于引用类型的变量不直接包含值,它的值存储在托管堆中。例如“
int[] arr1 = { 1};
int[] arr2 = arr1;
arr2[0] = 2;
Console.WriteLine(arr1[0]);
分析例子:
定义一个数组arr1,它有一个元素,其值为1,这个时候在线程堆栈中只有数组的名称、类型和一个指向值的地址,元素的值被保存在了托管堆中,当把arr1 的值赋给arr2 时,只是在线程堆栈中保存arr2的地方又加了一个指向托管堆中元素之的地址,即元素的 值自始至终只有一份在托管堆中,当arr2把元素的值改变后,要打印arr1的元素的值时也是改变后的值。
int[] arr2 = arr1;
arr2[0] = 2;
Console.WriteLine(arr1[0]);
分析例子:
定义一个数组arr1,它有一个元素,其值为1,这个时候在线程堆栈中只有数组的名称、类型和一个指向值的地址,元素的值被保存在了托管堆中,当把arr1 的值赋给arr2 时,只是在线程堆栈中保存arr2的地方又加了一个指向托管堆中元素之的地址,即元素的 值自始至终只有一份在托管堆中,当arr2把元素的值改变后,要打印arr1的元素的值时也是改变后的值。
转载于:https://blog.51cto.com/mydotnet/351374