再聊一次值类型和引用类型

简介: 这是一个托管的值类型,表示array的一个片断, 在用做websocket接收数据的载体时我发现每次值传递后, 这个ArraySegment<byte>貌似发生了变化。这勾起了我的探究欲。

为什么提出这样看似很浅显的问题,是因为有次我在使用ArraySegment<byte>值类型时,有感而发。


这是一个托管的值类型,表示array的一个片断, 在用做websocket接收数据的载体时我发现每次值传递后, 这个ArraySegment<byte>貌似发生了变化。这勾起了我的探究欲。


我们做一个简单的实验, 来证明【值类型作为函数形参, 形参被修改,不影响原值】不准确。


struct Slice 
    {
          public Array Array { get; set; }
          public int Offset { get; set; }
          public int Count { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            var slice = new Slice { Array = Array.CreateInstance(typeof(int), 5)};
            Test(slice);
            foreach(var i  in slice.Array)
            {
                Console.WriteLine(i); 
            }
            Console.ReadLine();
        }
  // 值类型传参,值传给tmp变量
        static void Test(Slice tmp)
        {
            tmp.Array.SetValue(1,1);
            tmp.Offset = 1;
            tmp.Count = 1;
        }
    }
 // 输出  0 1 0 0 0


slice变量的引用类型属性体现了变化,值类型Offset Count属性不会变化。


ec4b6b1a6c1b11f0b2b24ca1504ac44a.png


这个简单的Demo告诉我们:


大部分情况下:“值类型作为函数形参,形参被修改,不影响原值”, 但是如果修改的是值类型的引用类型字段,原值类型照样能体现修改


归根到底由值类型和引用类型的特性决定:


值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用,数据存储在数据堆中;


宽泛地讲:函数传参,都是值传递(拷贝), 只是引用类型传递的是原对象的引用或地址值。


本篇文章没啥干货,算是日常小记吧,各大佬轻喷。

相关文章
|
10月前
|
存储 C# C++
|
存储 Java Go
值类型和引用类型|学习笔记
快速学习值类型和引用类型。
76 0
值类型和引用类型|学习笔记
|
存储 Java
《基本类型和引用类型》
《基本类型和引用类型》
81 0
《基本类型和引用类型》
|
存储 开发框架 .NET
C#系列之值类型和引用类型
C#系列之值类型和引用类型
134 0
C#系列之值类型和引用类型
|
存储 Java 程序员
C#基础——值类型和引用类型
C#基础——值类型和引用类型
553 0
C#基础——值类型和引用类型
|
存储 数据格式 JSON
第183天:引用类型和值类型
一、内存分配 1、数值型内存分配 1 2 var num1; //这个时候不进行内存分配 3 var num3=9;//分配内存 4 var num4=num3;//会不会分配 5 6 // 这里到底分配还是不分配内存?? 7 // 答案 --分配内存 彼此拥有独立的内存空间,互不影响 8 console.
985 0
|
算法 C#
c#值类型与引用类型区别
值类型对象的两种表示方式:未装箱和已装箱,引用类型总是处于已装箱 值类型从System.ValueType派生。该类型提供了与System.Object相同方法,但System.ValueType重写了Equals方法, 能在两个对象的自断值完全匹配的前提下返回true。
937 0