C# List的赋值问题如何解决


这篇文章主要介绍“C#List的赋值问题如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C#List的赋值问题如何解决”文章能帮助大家解决问题。如下图所示,query1是个集合,把它赋值给了query2,当移除query2里面数据的时候,query1对应的数据也被移除了。对此猜测是引用类型的问题,类似于浅拷贝深拷贝那种概念。对于上述的情况,要怎么去赋值,以及不同的写法对应的结果是什么样的呢,我做了如下测试 ,在看结果之前,先了解一下相关概念。C#中的堆和栈:(指的是程序运行时的内存区域)内存分为堆区域和栈区域,栈空间比较小,但是读取速度快(先进后出),堆空间比较免费云主机域名大,但是读取速度慢。栈区:存放函数的参数,局部变量,返回数据等值,会自动释放。堆区:存放着引用类型的对象,会由GC来自动释放。值类型和引用类型值类型:在方法传递的时候,传递的是自身的“拷贝”。
(例如:结构体struct,数据类型short/int/double/bool,枚举类型enum,可空类型)引用类型:引用类型则是传递的自身的“地址”。
( 例如:数组,类,接口,委托,object,string)值类型只需要一段单独的内存(此处指栈区内存),用于存储实际的数据。引用类型需要两段内存,第一段存储实际的数据,位于堆中。第二段是一个引用,存储在栈里,指向数据在堆中的存放位置。特点:
1、值类型变量声明后,不管是否已经赋值,编译器为其分配内存。
2、引用类型当声明一个类时,只在栈中分配一小片内存用于容纳一个地址,而此时并没有为其分配堆上的内存空间。当使用 new
创建一个类的实例时,分配堆上的空间,并把堆上空间的地址保存到栈上分配的小片空间中。
3、值类型的实例通常是在线程栈上分配的(静态分配),但是在某些情形下可以存储在堆中。(某些情况指的是:作为字段时,跟随其所属的变量(实例)存储;作为局部变量时,存储在栈上。)
4、引用类型的对象总是在进程堆中分配(动态分配)。下图展示了4个list以及对应的赋值情况,从结果可以看出,list1、list3、list4的栈区内容都指向了同一个堆地址,所以当这三个list任意一个删除数据或添加数据,其他两个也会变化。而list2由于指向的堆地址跟其他三个不同,所以list2的数据变化不会影响到list1、list3、list4。其中list4比较出乎我的意料,印象中list t=new list中的关键字new,会在托管堆上重新分配空间,并返回一个该空间的地址,但是从结果上来看,list4还是指向了list1的堆地址。猜测可能是编译器的自动优化?就像string的赋值那样?下面是string的测试,图一是定义了三个变量,a、b、c,可以看出,a和b虽然是分别定义并且分别赋值的,但由于值一样,最终还是指向了同一个堆地址。而图二中,给a重新赋值后,发现它并没有去更改原地址中的数据,而是在堆中开辟了一块新的空间,并指向了这个新的堆地址(在栈中的地址没变)。关于“C#List的赋值问题如何解决”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注百云主机行业资讯频道,小编每天都会为大家更新不同的知识点。

相关推荐: Android onbackpressed如何实现返回键的拦截和弹窗

这篇“Androidonbackpressed如何实现返回键的拦截和弹窗”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Androidonback…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 03/22 14:28
下一篇 03/22 14:28

相关推荐