C# 值类型和引用类型讲解

要了解值类型和引用类型,我们首先要知道堆和栈的区别:

① 栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小

②存放在栈中时要管存储顺序,保持着先进后出的原则,它是一片连续的内存域,由系统自动分配和维护。
而堆是无序的,它是一片不连续的内存域由有用户自己来控制和释放,如果用户自己不释放的话,当内存达到一定的特定值时,通过垃圾回收器(GC)来回收。

C#的值类型包括:结构体,枚举,可空类型,byte,short,int,long,float,double,decimal,char,bool ;值类型是存储在数据栈上的;

C#的引用类型包括:数组,用户定义的类、接口、委托,object,字符串,引用类型存储在堆上。

了解了以上区别后,我们通过实例来展示下使用的区别:

引用类型举例:下面定义两个byte数组,交换下下标一致的数据:

代码如下:

            `static void Main(string[] args)
            {
                byte[] a = new byte[] { 1, 2, 3, 4, 5 };
                byte[] b = new byte[] { 6, 7, 8, 9, 10 };
                ChangeData(a, b);

                Console.Write($"a数组的值:");
                for (int i=0;i<  a.Count();i++)
                {
                    Console.Write($"{a[i]} ");
                }
                Console.WriteLine("\n ***********");
                Console.Write($"b数组的值:");
                for (int i = 0; i < b.Count(); i++)
                {
                    Console.Write($"{b[i]} ");
                }
                Console.ReadKey();
            }

            private static void ChangeData(byte[] aaa, byte[] bbb)
            {
                int tempa = aaa.Count();
                int tempb = bbb.Count();

                int count = tempa > tempb ? tempb : tempa;
                byte temp = 0;
                for (int i = 0; i < count; i++)
                {
                    temp = aaa[i];
                    aaa[i] = bbb[i];
                    bbb[i] = temp;
                }
               }`


虽然我们把byte数组传递给了方法ChangeData去处理了,但是处理完a,b的数据实现了交换,因为数组是引用类型,
所以上例中aaa和a都是指向的同一段地址,所以一个aaa改变后,a数组的值对应的有改变了。

值类型举例:

          `
          static void Main(string[] args)
                  {
                      //byte[] a = new byte[] { 1, 2, 3, 4, 5 };
                      //byte[] b = new byte[] { 6, 7, 8, 9, 10 };
                      //ChangeData(a, b);

                      //Console.Write($"a数组的值:");
                      //for (int i=0;i<  a.Count();i++)
                      //{
                      //    Console.Write($"{a[i]} ");
                      //}
                      //Console.WriteLine("\n ***********");
                      //Console.Write($"b数组的值:");
                      //for (int i = 0; i < b.Count(); i++)
                      //{
                      //    Console.Write($"{b[i]} ");
                      //}

                      int a = 5;
                      int b = 8;
                      ChangeValue(a,b);
                      Console.WriteLine($"a的值:{a}");
                      Console.WriteLine($"b的值:{b}");
                      Console.ReadKey();
                  }

                  //private static void ChangeData(byte[] aaa, byte[] bbb)
                  //{
                  //    int tempa = aaa.Count();
                  //    int tempb = bbb.Count();

                  //    int count = tempa > tempb ? tempb : tempa;
                  //    byte temp = 0;
                  //    for (int i = 0; i < count; i++)
                  //    {
                  //        temp = aaa[i];
                  //        aaa[i] = bbb[i];
                  //        bbb[i] = temp;
                  //    }
                  //}

                  private static void ChangeValue(int aaa, int bbb)
                  {
                      int temp = aaa;
                      aaa = bbb;
                      bbb = temp;
                  }
          `


我们看值交换后aaa和bbb值变化了,原始的a和b的值并没有变化。

posted @   IT-Lex  阅读(556)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示