C#数据类型,值类型和引用类型,值传递和引用传递

本文详细介绍了C#中的值类型和引用类型的区别,包括它们的存储方式、常见类型以及装箱和拆箱的概念。值类型直接存储值,如整型、浮点型和枚举;引用类型存储对象引用,如类、数组和接口。在数组赋值时,若要避免影响其他值,需进行数组复制。结构(struct)作为值类型的一种,适用于小规模数据存储。方法参数传递时,值传递不保留修改,而引用传递(ref)则会。建议在开发中减少不必要的装箱和拆箱操作,以提高性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值