1. 值类型
值类型源于System.ValueType家族,每一个值类型的对象都有一个独立的内存区域用于保存自己的值,值类型数据所在的内存区域成为栈(Stack),只要在代码中修改他就会在他的内存区域内保存这个值。对于值类型,不同的变量会分配不同的空间,并且存储空间存储的是该变量的值。
2. 引用类型
引用型源于System.Object家族,在C#中引用类型主要包括,数组吗,类,接口。引用类型赋值是把原对象的引用传递给另一个引用,对数组而言当一个数组引用赋值给另一个数组引用后,这两个引用指向同一个数组,也就是指向同一块存储空间。
数组复制可以利用循环使用
for (int I = 0 ; I <array1.Length; i++)
{
Array2[i]=array1[i]
}
把array1[i]里的数据添加到array2[i]
3. 细分值类型和引用类型
值类型:基本数据类型,枚举类型(enum),结构类型(struct)
引用类型:类,接口,数组
结构的定义:
语法:
访问修饰符 struct 结构名
{
//结构体
}
C#中值类型和引用类型的区别
- 值类型的数据存储在内存的栈中;引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的 地址。
- 值类型存取速度快,引用类型存取速度慢。
- 值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针或引用
- 值类型继承自System.ValueType,引用类型继承自System.Object
- 栈的内存分配是自动释放;而堆在.NET中会有GC来释放
- 值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。
- 结构的定义特点:
- 结构中可以有字段,可以有方法
- 定义时,结构中的字段补不能被赋初始值
- 结构的使用
- 可以不用new直接定义结构的对象
- 生命结构的对象后,必须给结构的成员赋初值
- 结构的使用经验
既然结构和类非常相似,是不是所有类都可以用结构来实现? 结构是值类型声明结构变量就存储结构的一个新副本,及系统要开辟一块新的存储空间,因此结构用的越多,存储空间用的也越多。int就是一个结构。
- 装箱和拆箱(值类型和引用类型相互转换)
- 装箱:值类型转换为引用类型的过程称为装箱。
- 拆箱:引用类型转换为值类型的过程称为拆箱。
装箱式例:
int i = 123;
object o = i; //装箱
int=456;
拆箱式例:
int i = 123;
object o = i;
int j =(int) o; //拆箱
经验:在实际开发中,尽量减少不必要的拆箱和装箱,因为二者的存储方式不同转换时性能损失较大。
不同参数的传递
值(value)传递和引用(reference)传递
- 使用值传递,在方法中对参数值的更改在调用后不能保留。
- 使用ref方式传递,可以保留对参数值的更改。
小结:
- 使用值方式(不用ref)传递值类型参数时,参数在方法中的修改不会保留
- 使用值方式(不用ref)传递引用类型时,参数在方法中的修改会保留
- 使用引用方式(用ref)传递值类型或引用值类型参数时,参数在方法中的修改都会保留