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

简介: 这是一个托管的值类型,表示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告诉我们:


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


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


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


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


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

相关文章
|
搜索推荐 JavaScript 前端开发
77 网站点击流数据分析案例(原理及意义)
77 网站点击流数据分析案例(原理及意义)
802 0
|
算法 Ubuntu API
探索FFmpeg:实现自定义播放速度的全方位指南(二)
探索FFmpeg:实现自定义播放速度的全方位指南
545 0
|
11月前
|
缓存 前端开发 应用服务中间件
CORS跨域+Nginx配置、Apache配置
CORS跨域+Nginx配置、Apache配置
539 7
|
10月前
|
存储 关系型数据库 数据库
Postgres数据库BRIN索引介绍
BRIN索引是PostgreSQL提供的一种高效、轻量级的索引类型,特别适用于大规模、顺序数据的范围查询。通过存储数据块的摘要信息,BRIN索引在降低存储和维护成本的同时,提供了良好的查询性能。然而,其适用场景有限,不适合随机数据分布或频繁更新的场景。在选择索引类型时,需根据数据特性和查询需求进行权衡。希望本文对你理解和使用PostgreSQL的BRIN索引有所帮助。
301 0
|
机器学习/深度学习 TensorFlow 语音技术
手把手教你用Python打造一个语音合成系统
手把手教你用Python打造一个语音合成系统
341 0
手把手教你用Python打造一个语音合成系统
|
存储 前端开发 算法
加密算法在网络通信中的应用及优势分析
本文将探讨加密算法在网络通信中的重要性,以及不同加密算法的应用和优势。通过对前端、后端、Java、Python、C、PHP、Go等多种技术的分析,我们将了解在日益增长的网络威胁下,加密算法对于确保数据安全和隐私保护的必要性。
|
jenkins 持续交付
【Jenkins】使用brew安装jenkins并配置局域网IP访问
解决Jenkins≈只能用localhost\127.0.0.1访问,但无法通过IP地址访问的问题
8994 0
|
安全 Java
每日一博 - CAS(Compare-And-Swap)原理剖析
每日一博 - CAS(Compare-And-Swap)原理剖析
176 0
|
Linux 测试技术 数据安全/隐私保护
Fedora32 Server版安装与初体验
Fedora32 Server版安装与初体验
588 0
Fedora32 Server版安装与初体验