iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#List的赋值问题的解决
  • 305
分享到

C#List的赋值问题的解决

2024-04-02 19:04:59 305人浏览 泡泡鱼
摘要

目录问题描述原因分析:基础概念:本地测试:问题描述 如下图所示,query1是个集合,把它赋值给了query2,当移除query2里面数据的时候,query1对应的数据也被移除了。

问题描述

如下图所示,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的赋值问题的解决的文章就介绍到这了,更多相关C# List赋值内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C#List的赋值问题的解决

本文链接: https://www.lsjlt.com/news/164950.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C# List的赋值问题的解决
    在C#中,List对象的赋值问题可以通过以下几种方式解决:1. 使用构造函数进行赋值:```csharpList list1 = n...
    99+
    2023-08-15
    C#
  • C#List的赋值问题的解决
    目录问题描述原因分析:基础概念:本地测试:问题描述 如下图所示,query1是个集合,把它赋值给了query2,当移除query2里面数据的时候,query1对应的数据也被移除了。 ...
    99+
    2024-04-02
  • c语言的连续赋值问题怎么解决
    C语言的连续赋值问题是指在一条语句中连续赋值多个变量时可能会出现的问题。例如: int a, b; a = b = 10; 在这个例...
    99+
    2023-10-27
    c语言
  • vue中的传值及赋值问题怎么解决
    这篇文章主要介绍“vue中的传值及赋值问题怎么解决”,在日常操作中,相信很多人在vue中的传值及赋值问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue中的传值及赋值问题怎么解决”的疑惑有所帮助!...
    99+
    2023-06-30
  • c语言int未赋初值问题怎么解决
    在C语言中,如果一个int类型的变量未赋初值,它的值是不确定的,可能是随机的。为了避免这种情况,可以通过以下方法解决: 直接为i...
    99+
    2024-02-29
    c语言
  • vue 数据(data)赋值问题的解决方案
    总结一下我遇到的一个纠结很久的问题。 在项目中需要用到后台的数据对前端渲染,使用到了vue整合的axios,使用vue中的钩子函数在页面组件挂载完成之后向后台发送一个get请求然后将...
    99+
    2024-04-02
  • 解决使用mybatis取值,字段赋值错误的问题
    目录使用mybatis取值,字段赋值错误mybatis映射赋值失败错误输出错误造成原因解决方法使用mybatis取值,字段赋值错误  我在读取数据库的表信息时,出现了不同字...
    99+
    2024-04-02
  • c语言静态变量赋值问题怎么解决
    在C语言中,静态变量的赋值是在程序运行前就确定的,一般是在编译时期进行赋值。如果需要在运行时期赋值静态变量,可以使用函数来实现。 以...
    99+
    2023-10-27
    c语言
  • MyBatis查询数据,赋值给List集合时,数据缺少的问题及解决
    目录MyBatis查询数据赋值给List集合数据缺少解决办法Mybatis查询时数据丢失的问题经过排查得出结论解决办法MyBatis查询数据赋值给List集合数据缺少 今天在使用My...
    99+
    2024-04-02
  • Python List的赋值方法
      Python中关于对象复制有三种类型的使用方式,赋值、浅拷贝与深拷贝。他们既有区别又有联系,刚好最近碰到这一类的问题,研究下。 一、赋值         在python中,对象的赋值就是简单的对象引用,这点和C++不同。如下:    ...
    99+
    2023-01-31
    赋值 方法 Python
  • vue中的传值及赋值问题
    目录vue的传值及赋值先看一下场景解决方法vue的赋值小技巧严谨代码undefined判断vue的传值及赋值 作为Vue非资深的学习者,在工作中使用vue的时候还是遇见的很多所谓的坑...
    99+
    2024-04-02
  • antdvuev-decorator的取值与赋值问题
    目录antd vue v-decorator的取值与赋值ant design vue之v-decorator问题1.在template中直接使用2.在script中设置校验规则3. ...
    99+
    2023-05-17
    antd vue v-decorator v-decorator的取值 v-decorator的赋值
  • 解决numpy数组互换两行及赋值的问题
    看代码吧~ import numpy as np a = np.array([[1,1,1],[2,2,2],[3,3,3], [4,4,4]]) tmp = a[1] a[1...
    99+
    2024-04-02
  • vue中props赋值给data出现的问题及解决
    目录vue props赋值给data问题props赋值给data 数据变化例如vue props赋值给data问题 vue 中父组件向子组件传递数据用 props, 但是子组件是无法...
    99+
    2022-11-13
    vue中props赋值 props赋值给data vue props赋值问题
  • Python中list列表的赋值方法及遇到问题处理
    目录1.列表list赋值方法2.浅拷贝(shallowcopy)3.深拷贝4.关于拷贝操作的提醒问题起源: 本文的原因是因为在使用list的直接赋值b=a时,得到的结果与预期不同,后...
    99+
    2024-04-02
  • java全局变量赋值问题怎么解决
    在Java中,全局变量可以通过以下几种方式进行赋值:1. 在声明全局变量时直接赋值:```javapublic class MyCl...
    99+
    2023-08-16
    java
  • java全局变量赋值问题如何解决
    在Java中,可以使用静态变量来实现全局变量的赋值。静态变量是指在类中使用关键字"static"声明的变量,它属于整个类而不是某个对...
    99+
    2023-08-29
    java
  • Python中list列表的赋值方法及遇到的问题怎么处理
    这篇文章主要介绍“Python中list列表的赋值方法及遇到的问题怎么处理”,在日常操作中,相信很多人在Python中list列表的赋值方法及遇到的问题怎么处理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”P...
    99+
    2023-06-29
  • 解析Orika的MapperFacade属性赋值的使用问题
    目录MapperFacade 拷贝对象、拷贝集合的使用demo测试拷贝对象拷贝集合MapperFacade 拷贝对象、拷贝集合的使用 介绍MapperFactory、MapperFa...
    99+
    2024-04-02
  • 关于vue3中的reactive赋值问题
    目录vue3 reactive赋值问题vue3 reactive的坑清空数组清空对象vue3 reactive赋值问题 vue3中直接对reactive整个对象赋值检测不到 let ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作