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

开发 后端
C#值类型,作为函数形参,形参被修改,不影响原值。这是我们在初始学习编程时需要记住的内容,我们也是一直这样践行的。

[[419862]]

C#值类型,作为函数形参,形参被修改,不影响原值。

这是我们在初始学习编程时需要记住的内容,我们也是一直这样践行的。

先说结论:这是不准确的。

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

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

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

  1. struct Slice  
  2.     { 
  3.           public Array Array { get; set; } 
  4.           public int Offset { get; set; } 
  5.           public int Count { get; set; } 
  6.     } 
  7.  
  8.     class Program 
  9.     { 
  10.         static void Main(string[] args) 
  11.         { 
  12.             var slice = new Slice { Array = Array.CreateInstance(typeof(int), 5)}; 
  13.             Test(slice); 
  14.  
  15.             foreach(var i  in slice.Array) 
  16.             { 
  17.                 Console.WriteLine(i);  
  18.             } 
  19.             Console.ReadLine(); 
  20.         } 
  21.   // 值类型传参,值传给tmp变量 
  22.         static void Test(Slice tmp) 
  23.         { 
  24.             tmp.Array.SetValue(1,1); 
  25.             tmp.Offset = 1; 
  26.             tmp.Count = 1; 
  27.         } 
  28.     } 
  29.      
  30.  // 输出  0 1 0 0 0 

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

这个简单的Demo告诉我们:

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

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

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

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

 

责任编辑:武晓燕 来源: 精益码农
相关推荐

2009-10-10 09:53:07

.NET值类型

2009-08-19 16:39:44

C#值类型C#引用类型

2009-08-26 14:05:19

C#值类型和引用类型

2011-06-08 13:03:52

C#值类型引用类型

2009-10-22 18:41:49

CLR VIA C#教

2013-05-23 17:21:16

C#

2009-08-31 14:34:46

C#值类型C#结构类型

2016-08-18 14:13:55

JavaScript基本数据引用数据

2017-02-27 08:34:09

JavaScript数据引用

2011-07-11 14:36:05

JAVA

2024-05-20 08:58:13

Java引用类型垃圾回收器

2021-10-14 10:25:05

JavaScript类型函数

2009-08-14 17:09:48

C#引用类型

2009-08-27 16:39:26

C# String类型

2022-04-17 10:29:10

TSTypeScript对象类型

2021-05-30 07:59:00

String引用类型

2009-08-24 13:52:04

C# 泛型约束

2009-09-11 11:17:04

C#引用类型

2009-06-08 18:05:00

Java进阶引用

2009-09-11 11:09:36

C#引用类型
点赞
收藏

51CTO技术栈公众号