C# 结构体集合元素属性不可修改疑惑
2024-09-22 17:42:44
背景:用C#的人都知道结构体在C#中是值类型的,由于这个原因出现了一个有趣的问题,那就是结构体集合通过数字索引修改对应属性的值能不能影响到集合中的结构体呢?答案很多人可能会说不能,因为结构体是值类型的那是一个副本;也可能有人说会,因为它是通过集合索引来操作的,集合本身时引用类型,集合索引取得的将是集合引用的一个地址按理应该也是引用类型的。
结论:结果可能会大跌眼镜,结果是C#编译器根本通不过这样的修改,有关文档的说法是值类型的数据是一个栈上的值,索引取出的是一个栈返回值是一个临时数据副本,即使能够修改结果也影响不到原有数据,所以编译器禁止做这样的操作。(C++中由于结构体是一个特殊的类属于引用类型因此没有这个问题)
疑惑:既然C#设计者认为不能用集合修改结构体,但当天我用数组的方式却成功的修改成功了,不但通过了语法而且数据也修改成功了,我第一次是用的ToArray方法实现的,有人可能会说你这样躲避了编译器检查,但是后来我再用数组声明并添加达到了同样的效果,这个结论是不是与上一步的结论栈数据不能修改即使修改了也不能影响原有数据矛盾呢?
猜测:无法解释这里面的原因,因为不像JAVA那样开源所以不知道这里面的机制,但是我猜测集合的索引底层应该是一个方法返回的值是一个临时栈,而数组声明的是一个栈变量,数组的索引是用的指针取得值而非方法返回的临时副本,所以可以修改并且会影响到原有数据,不知道这种猜测是否合理,欢迎读者留言交流以求真相。
代码:
https://download.csdn.net/download/hirisw/10486222
最新文章
- 树莓派3B的食用方法-1(装系统 网线ssh连接)
- Storm内部的消息传递机制
- 【APP设计利器】Sketch 41 Mac中文破解版(含汉化插件)
- opencv 处女作
- SQL Server Profiler使用教程,通俗易懂才是王道
- Shell变量的定义与赋值操作注意事项
- Codeforces Round #249 (Div. 2) B. Pasha Maximizes
- 【POJ】2296 Map Labeler
- 转_Java中常用的设计模式总结
- Python3 学习第三弹:异常情况如何处理?
- Ninject是一款.Net平台下的开源依赖注入框架
- COGS 862. 二进制数01串【dp+经典二分+字符串】
- xshell使用rz/sz完成文件上传下载
- 使用 mod_rewrite 来修改 Confluence 6 的 URLs
- 自动化测试-2.seleniumIDE
- 复制神器Ditto使用方法详细说明
- MVC自定义视图引擎地址
- zw版【转发·台湾nvp系列Delphi例程】HALCON Roberts2
- js中Math.round、parseInt、Math.floor和Math.ceil小数取整小结
- ali验证码推送接口调用