【值类型作为函数形参,形参被修改,不影响原值】 不怎么正确。
C# 值类型作为函数形参,形参被修改,不影响原值。
这是我们在初始学习编程时需要记住的内容,我们也是一直这样践行的。
先说结论:这是不准确的。
为什么提出这样看似很浅显的问题,是因为有次我在使用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(); } static void Test(Slice tmp) { tmp.Array.SetValue(1,1); tmp.Offset = 1; tmp.Count = 1; } } // 输出 0 1 0 0 0
这个简单的Demo告诉我们:
大部分情况下:“值类型作为函数形参,形参被修改,不影响原值”, 但是如果修改的是值类型的引用类型字段, 原值类型照样能体现修改。
归根到底由值类型和引用类型的特性决定:
值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用,数据存储在数据堆中;
宽泛地讲:函数传参,都是值传递, 只是引用类型传递的是 原对象的引用地址值。
本篇文章没啥干货,算是日常小记吧,各大佬轻喷。
本文来自博客园,作者:{有态度的马甲},转载请注明原文链接:https://www.cnblogs.com/JulianHuang/p/15210938.html
欢迎关注我的原创技术、职场公众号, 加好友谈天说地,一起进化
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?