当前位置: 首页 > 科技观察

再说说值类型和引用类型

时间:2023-03-13 23:27:57 科技观察

C#值类型,作为函数参数,修改参数不影响原值。这是我们刚开始学习编程时需要记住的,我们一直都是这样练习的。首先得出结论:这是不准确的。之所以问这样一个看似简单的问题,是因为我在使用ArraySegment值类型的时候就感受到了。这是一个托管值类型,代表数组的一部分。当作为websocket接收数据的载体时,我发现ArraySegment似乎在每传递一个值后都会发生变化。这激起了我探索的欲望。我们做个简单的实验来证明【值类型作为函数参数,修改参数不影响原值】是不准确的。structSlice{publicArrayArray{get;set;}publicintOffset{get;set;}publicintCount{get;set;}}classProgram{staticvoidMain(string[]args){varslice=newSlice{Array=Array.CreateInstance(typeof(int),5)};Test(slice);foreach(variinslice.Array){Console.WriteLine(i);}Console.ReadLine();}//值类型参数,值传递给tmp变量staticvoidTest(Slicetmp){tmp.Array.SetValue(1,1);tmp.Offset=1;tmp.Count=1;}}//输出01000slice变量的引用类型属性反映变化,值类型OffsetCount属性不会变化。这个简单的demo告诉我们:大多数情况下:“值类型作为函数参数,修改参数不影响原值”,但如果修改的是值类型的引用类型字段,原值类型仍然可以反映修改。归根结底是由值类型和引用类型的特性决定的:值类型的变量直接存储数据,而引用类型的变量持有对数据的引用,数据存储在数据堆中;广义上讲:函数参数都是按值传递(拷贝),但引用类型传递的是原对象的引用或地址值。