C#中对值类型和引用类型的一点认识

区别值类型和引用类型的重要一点就是值类型赋值的时候是给出一块内存空间,空间里放下要赋给值类型的值。而引用类型是开辟一块内存空间,空间里放下的是要赋给引用类型值的指向地址。

就像一个是复制了银行卡里的现金,你花了你复制的现金,和该银行卡是没有关系的。而引用类型是复制了一个银行卡,此卡为银行卡的副卡,因为他们的指向地址是一样的,所以当你使用副卡

的时候,主卡里的钱也会随之变动。

下面给出一段代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WindowsConsoleApplicationValueAndReference
{
    class Program
    {
        static void Main(string[] args)
        {
            ReferenceAndValue.ReferenceAndValueMethod();
            
        }

    }
    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }
    public static class ReferenceAndValue
    {
        public static void ReferenceAndValueMethod()
        {
            Person tang = new Person { Name = "Andelshejlsberge", Age = 25 };
            int age = tang.Age;//age=tang.age=25
            tang.Age = 22;

            Person name = tang;//name.Name=andelshejlsberge
            tang.Name = "tangxuelong";//tang.name=tangxuelong name.name=tang.name=tangxuelong

            Console.WriteLine("tang.Name={0}",tang.Name);
            Console.WriteLine("tang.age={0}", tang.Age);
            Console.WriteLine("age={0}", age);
            Console.WriteLine("name={0}", name.Name);
            Console.ReadLine();

        }
    }
}

分析一下代码。首先创建了一个person类,该类中包含name和age俩个属性

我们在方法中创建person的对象tang,初始化对象的name和age。

这时候看下一步,我们将对象tang的age赋值给一个int类型的变量age,然后改变对象tang的age的值,运行结果会告诉我们,此时age=25,tang.age=22;

接下来我们继续看下面的代码,继续创建一个对象将tang赋值给该对象。那么此时如果加入断点的话我们都知道name.Name=tang.Name=andershejlsberge这是没错的。那么接下来像上面一样我们改变tang.name的值我们会发现,name.name的值此时也改变了。

就像开始说的那样,引用类型不仅仅分配了内存空间,还解析了内存块的指向地址。

装箱和拆箱

装箱和拆箱其实就是引用类型和值类型之间的转换

值类型转换为引用类型就是装箱,引用类型转换为值类型就是拆箱。

public static class boxingAndUnboxing
    {
        public static void boxingandunboxing()
        {
            int ageInt = new int();

            //boxing
            object age =(object)ageInt;

            age = null;

            //unboxing
            ageInt = (int)age;

            Console.WriteLine(ageInt);
        }
    }

分析一下上面的代码。这段代码会抛出System.NullReferenceException异常,因为age为引用类型,引用类型是可以赋空值的,然后将引用类型转换为值类型时,引用类型没有值。。

所以就抛出了异常。而去掉这段代码输出结果为0,这是因为我们没有初始化,默认的值类型变量的值就为0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C#中,值类型引用类型是两种不同的数据类型,它们有以下区别: 1. 存储方式: - 值类型的对象直接存储在栈内存中。每个值类型的变量都包含它自己的数据副本,它们的赋值操作是将一个值复制到另一个变量中。 - 引用类型的对象存储在堆内存中,而变量则存储在栈内存中。变量实际上只是引用对象的地址,多个变量可以引用同一个对象。 2. 内存管理: - 值类型的对象由系统自动分配和释放内存,它们的生命周期与其所在的作用域相同。当变量离开作用域时,相关的内存会自动释放。 - 引用类型的对象由垃圾回收器(Garbage Collector)来管理内存。垃圾回收器会自动跟踪对象的引用并在适当的时机回收不再使用的内存。 3. 传递方式: - 值类型的参数在方法调用时,会将实际的值进行复制,并在方法内部使用副本进行操作。对参数的修改不会影响到原始值。 - 引用类型的参数在方法调用时,传递的是引用的副本。方法内部对参数的修改会影响到原始对象。 4. 默认值: - 值类型的变量在声明时会被初始化为默认值,如int类型的默认值是0,bool类型的默认值是false。 - 引用类型的变量在声明时会被初始化为null,表示没有引用任何对象。 5. 比较方式: - 值类型的比较是按照值本身进行比较,如果值相等,则认为两个对象相等。 - 引用类型的比较是按照引用进行比较,只有当两个引用指向同一个对象时,才认为两个对象相等。 总结: 值类型引用类型在存储方式、内存管理、传递方式、默认值和比较方式等方面有一些区别。理解这些区别对于正确使用和管理不同类型的数据非常重要。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值