• C# 结构体集合元素属性不可修改疑惑


    背景:用C#的人都知道结构体在C#中是值类型的,由于这个原因出现了一个有趣的问题,那就是结构体集合通过数字索引修改对应属性的值能不能影响到集合中的结构体呢?答案很多人可能会说不能,因为结构体是值类型的那是一个副本;也可能有人说会,因为它是通过集合索引来操作的,集合本身时引用类型,集合索引取得的将是集合引用的一个地址按理应该也是引用类型的。

    结论:结果可能会大跌眼镜,结果是C#编译器根本通不过这样的修改,有关文档的说法是值类型的数据是一个栈上的值,索引取出的是一个栈返回值是一个临时数据副本,即使能够修改结果也影响不到原有数据,所以编译器禁止做这样的操作。(C++中由于结构体是一个特殊的类属于引用类型因此没有这个问题)

    疑惑:既然C#设计者认为不能用集合修改结构体,但当天我用数组的方式却成功的修改成功了,不但通过了语法而且数据也修改成功了,我第一次是用的ToArray方法实现的,有人可能会说你这样躲避了编译器检查,但是后来我再用数组声明并添加达到了同样的效果,这个结论是不是与上一步的结论栈数据不能修改即使修改了也不能影响原有数据矛盾呢?

    猜测:无法解释这里面的原因,因为不像JAVA那样开源所以不知道这里面的机制,但是我猜测集合的索引底层应该是一个方法返回的值是一个临时栈,而数组声明的是一个栈变量,数组的索引是用的指针取得值而非方法返回的临时副本,所以可以修改并且会影响到原有数据,不知道这种猜测是否合理,欢迎读者留言交流以求真相。

    代码:

    https://download.csdn.net/download/hirisw/10486222

  • 相关阅读:
    (二十五)Struts2 Tiles集成
    (二十四)Struts2 Spring集成
    etcd 和 redis的使用场景
    react v16.12 源码阅读环境搭建
    gmail邮箱怎么批量删除邮件
    动态创建的元素怎么做动画
    Window 添加定时任务
    commons-pool2-中的一些配置
    Activiti 5.18 流程Model 转成 流程BPMN文件
    Activiti 使用自己的身份认证服务
  • 原文地址:https://www.cnblogs.com/hirisw/p/9202201.html
Copyright © 2020-2023  润新知