-
C#数据类型,值类型和引用类型,值传递和引用传递
- 值类型:每个值类型的对象都有一个独立的存储空间,存储空间中存储的是该变量的值,
- 这个内存空间称为栈(stack),值类型主要包括基本数据类型和枚举类型等,
- 当修改值的时候,就会在内存空间中保留这个值,不同的变量会分配不同的空间,改变一个变量的值不会影响另一个变量的值。
- 引用类型:在C#中主要包括数组,类和接口等。
- 它会把实际的值存放在堆内存中,把存放地址存放在栈中。
- 对于引用类型来说,赋值是将源对象的引用传递给另一个引用,对数组而言,其中一个数组引用赋值给另一个数组时,不会另外分出一块空间,两个应用指向同一块存储空间。
-
区别:从概念上来看,其区别是值类型直接存储值,而引用类型存储对值的引用。
- 相同点:引用类型和值类型都继承自System.Object类。
- 区别图鉴
-
值类型
引用类型
源自
System.ValueType
System.Object
存储方式
存储值
存储对象引用
常用类型
基本数据类型
整型:int
类
基类:System.Object
长整型:long
浮点型:float、double
字符串:string
字符型:char
自定义类:class
布尔型:bool
枚举类型(enum)
接口
结构类型(struct)
数组
- 数组中存的值如何在不影响另一个值的情况下去赋值
- 解决方法:可以进行数组复制,将Array1赋值给Array2
for(int i = 0; i < 数组长度; i++){
Array2[i] = Array1[i];
}
- 什么是结构:struct
- 类似于类的一个组织单元,用法和类类似
- 当此类中具有的字段都是值类型且个数比较少时使用
- 结构是值类型,声明结构变量就要在系统中开辟一块新的空间,数据提取速度快
- 结构的使用:
- 结构中可以有字段和方法,定义时结构中的字段不能被赋初始值
- 可以不用new,直接定义结构对象,申明对象后,必须给结构的成员赋初始值
- 弊端:频繁的赋值操作会占用较大空间, 在开发中多数情况下都定义为类!!
//示例:
public struct Student
{
//字段不能直接被赋初始值
public int id; //ID
public int age; //年龄
//定义一个方法
public void Show(){
Console.WriteLine("ID为:{0},年龄为:{1}",id,age);
}
}
static void main(String [] args){
Student stu; //创建学生结构
stu.id = 1001; //给学号赋值
stu.age = 20; //给年龄赋值
stu.Show();
}
- 装箱和拆箱结构示意图:值类型转换为引用类型称为装箱,反之称为拆箱
static void Main(string[] args)
{
int i = 123;
object o = i; // 装箱,object是所有类的基类
int j = (int)o; //拆箱,被转换引用类型的值必须能够转换为目标值类型
}
- 注:在实际的开发中,应该尽量减少不必要的装箱和拆箱,因为二者的存储方式不同,转换时性能损失较大
方法的参数传递方式:
- 值传递
- 传递值类型参数,在方法中对参数值的修改在调用后不能保留,参数不会发生变化
- 参数时为引用类型时,当引用变量发生变化时,参数也会发生变化,可以保留参数值的修改
- ref传递(ref 引用方式传递引用类型参数)
- 传递引用类型或值类型参数,其值的修改都会保留
不同类型参数传递
参数变化是否保留
值方式传递值类型
否
值方式传递引用类型
是
引用方式(ref)传递值类型
是
引用方式(ref)传递引用类型
是
- 注:使用ref传值是在实参和形参前都要加上ref