C#从入门到精通(19)—C#值类型与引用类型

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家人工智能学习网站

前言

大家好,我是上位机马工,硕士毕业4年年入40万,目前在一家自动化公司担任软件经理,从事C#上位机软件开发8年以上!在C#中,数据类型主要分为两大类:值类型和引用类型。这两者在内存中的存储方式、赋值行为以及生命周期等方面存在显著区别。

1、值类型

值类型变量直接包含其数据。当创建值类型变量时,系统会在栈(Stack)上为其分配内存空间,并将数据直接存储在那里。值类型包括以下几种:

结构体(Structs)
枚举(Enums)
整型(Int, Long, Short, Byte, SByte, UInt, ULong, UShort)
浮点型(Float, Double, Decimal)
布尔型(Bool)
字符型(Char)
值类型的特点:

变量直接存储数据。
赋值操作会创建数据的副本。
生命周期由包含它的作用域决定。
在这里插入图片描述

2、引用类型

引用类型变量存储的是数据的引用(即数据的内存地址),而不是实际数据。当创建引用类型变量时,系统会在堆(Heap)上为其分配内存空间,并将数据存储在那里。然后,该变量会在栈上保存这个内存地址。引用类型包括以下几种:

类(Classes)
接口(Interfaces)
数组(Arrays)
委托(Delegates)
字符串(String,虽然它是引用类型,但在某些情况下其行为类似于值类型)
引用类型的特点:

变量存储的是数据的引用(内存地址)。
赋值操作会复制引用,但不会复制数据本身。
生命周期由垃圾回收器(Garbage Collector)管理。
在这里插入图片描述

3、值类型与引用类型区别分析

下面是一个简单的示例,展示了值类型和引用类型在赋值时的不同行为:
在下面的代码中,更改point1的值,point2的值不变 ;但是更改myClass1的值,myClass2 的值也发生改变,这是因为值类型复制的时候会在栈中重新开辟一块新的内存,两个变量的值以后互不干扰;但是复制引用类型,只是在栈上复制了引用(堆上的内存地址),其实两个变量同时指向了堆上的同一块内存,所以更改一个变量也会改变另一个变量的值。

struct Point // 值类型  
{  
    public int X;  
    public int Y;  
}  
  
class MyClass // 引用类型  
{  
    public int Value;  
}  
  
   public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            Point point1 = new Point { X = 1, Y = 2 }; // 在栈上分配内存  
            Point point2 = point1; // 复制point1的值到point2,两个变量包含相同的数据  

            MyClass myClass1 = new MyClass { Value = 10 }; // 在堆上分配内存,myClass1保存引用  
            MyClass myClass2 = myClass1; // myClass2保存与myClass1相同的引用,指向堆上的同一个对象  

            // 修改point1的值,point2的值不变  
            point1.X = 100;
            Console.WriteLine($"point1.X: {point1.X}, point2.X: {point2.X}"); // 输出:point1.X: 100, point2.X: 1  

            // 修改myClass1的值,myClass2的值也改变,因为它们引用的是同一个对象  
            myClass1.Value = 100;
            Console.WriteLine($"myClass1.Value: {myClass1.Value}, myClass2.Value: {myClass2.Value}"); // 输出:myClass1.Value: 100, myClass2.Value: 100  

        }
    }

作者介绍

马工2017年硕士毕业,一直从事上位机软件开发工作,在我工作的第四年年薪突破了40万+,为了帮助跟我一样从底层出身的上位机软件工程师早日达到高级工程师的水平,早日找到30万+的工作,我根据多年项目经验,总结出了一系列可直接用于项目的C#上位机实战教程推荐给大家,目前在CSDN已经超过一千人订阅,如果你不甘贫庸,想像我一样早日拿到高薪,马工强烈推荐你早日学这套教程,雷军曾说这个世界上有99%的问题别人都遇到过,你要做的不是闷头干!而是找这个领域的专家问一下,这是最快速提升自己的方法!

年入30万+C#上位机实战必备教程推荐(点击下方链接即可访问文章)

1、《C#串口通信从入门到精通》
2、《C#与PLC通信从入门到精通 》
3、《C# Modbus通信从入门到精通》
4、《C#Socket通信从入门到精通 》
5、《C# MES通信从入门到精通》
6、《winform控件从入门到精通》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

c#上位机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值