当前位置:首页 > 通信资讯 > 正文

C#引用类型和值类型(c#值类型和引用类型的区别并举例)

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

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

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

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

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

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

  1. structSlice
  2. {
  3. publicArrayArray{get;set;}
  4. publicintOffset{get;set;}
  5. publicintCount{get;set;}
  6. }
  7. classProgram
  8. {
  9. staticvoidMain(string[]args)
  10. {
  11. varslice=newSlice{Array=Array.CreateInstance(typeof(int),5)};
  12. Test(slice);
  13. foreach(variinslice.Array)
  14. {
  15. Console.WriteLine(i);
  16. }
  17. Console.ReadLine();
  18. }
  19. //值类型传参,值传给tmp变量
  20. staticvoidTest(Slicetmp)
  21. {
  22. tmp.Array.SetValue(1,1);
  23. tmp.Offset=1;
  24. tmp.Count=1;
  25. }
  26. }
  27. //输出01000

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

C#引用类型和值类型(c#值类型和引用类型的区别并举例)

这个简单的Demo告诉我们:

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

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

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

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

原文链接:https://mp.weixin.qq.com/s/LdOcpmVDkMh1HPrBEipjBg

如果您对该产品感兴趣,请填写办理(客服微信:xiaoxiongyidong)

为您推荐:

发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。