List中的值类型无法修改的原因详解
来源:互联网 发布:淘宝店宝贝被自动下架 编辑:程序博客网 时间:2024/04/26 18:08
我们假设有这样的一个结构体。因为结构体是值类型的,在没有修饰的情况下,我们的方法中,传入,传出都是传递的值,每次传递都进行了一次值的拷贝。
所以,我们这样操作是不可行的。
datas[1].value = 10;
为什么呢,因为datas[1]不是第二个对象,而是第二个对象的副本,你修改副本,当然不会影响原本的值了。正确的写法是这样的
datas[1] = new AA(10);
这只是开始。可能有人会问,为什么我用data[i]是这个元素的副本呢?我们来详细的介绍一下。
首先,请先阅读MSDN以增加一些基础的了解
struct(C# 参考)
结构(C# 编程指南)
如何:了解向方法传递结构和向方法传递类引用之间的区别(C# 编程指南)
了解过基础,我们看看正题
这里都明白,返回的f是定义的f的一个副本,没有问题吧。
看看List<T>的索引器
以上3个例子看懂。这个问题就清晰了。
贴的这3个代码已经很明显的告诉你这样一个原因:
data[1]是通过List<T>的索引器访问的值类型数组中的某个元素,返回的是这个元素的副本。而设置也是副本设置,所以可以设置,可以读取,不可以通过副本的修改影响到List<T>中的值类型数组。
为了进一步证明这一点,我来用一个反射的例子来演示一下:
结果:
原始List:
1
2
使用List的索引器赋值
1
2
反射List内部的值类型数组赋值
2
3
还没看懂的,最后再讲一次。
List<T>[i]
这是叫做索引器的,索引器是一种属性,属性就是在调用方法,而值类型无法返回一个引用,返回的是值,所以索引器返回的,是你添加进去变量的副本。而因为值类型无法传递引用,所以添加实际也是使用副本的方式添加的。所以对于值类型的List<T>,索引器的结果,可以访问,可以修改,但无法直接存回去,如何保存?可以重新的赋值,例如
List<Point> points = new List<Point>();
points.Add(new Point());//0,0
修改呢,就整个重新复制
points[0] = new Point(1,1);
你不能修改一项points[0].X = 1;
这样不可以的。
希望这样说,各位不明白的能明白。明白的更明白。
- List中的值类型无法修改的原因详解
- List中的值类型无法修改的原因详解
- List中的值类型无法修改的原因详解
- C# 自定义值类型 T 的List<T>[i] 无法修改成员的字段值
- List类型对应的jedis操作详解
- 详解win7中的文件属性“访问时间”和“修改时间”不一致的原因分析 【原来LastAccessTime早就没用了】
- 使用迭代器遍历List的时候修改List报ConcurrentModificationException异常原因分析
- 使用迭代器遍历List的时候修改List报ConcurrentModificationException异常原因分析
- 使用迭代器遍历List的时候修改List报ConcurrentModificationException异常原因分析
- 使用迭代器遍历List的时候修改List报ConcurrentModificationException异常原因分析
- 修改list中的元素
- 修改List中的项目
- android工程中的R.java文件无法生成的原因
- 网狐机器人新增无法修改金币的原因及修改方法
- Java中的char类型以及不建议使用的原因
- sqlserver2008无法修改表字段类型的解决方案之一
- String类型值不可变的原因
- mybatis显示修改数据库成功, 但没有修改数据库的原因 (mybatis可以查询但无法修改数据库)
- css -- 有没有办法选择文本结点
- 自强网站添加Ubuntu9.10更新源
- Installing Resin using the .deb package on Ubuntu and Debian
- 什么是OEM
- 写给自己,生活小记
- List中的值类型无法修改的原因详解
- Hybird3D DEMO
- 计算机图形学617惨案
- 可编程数据流模型
- 完美开发者
- Silverlight Analytics Framework(开源分析框架)
- 网站系统架构对于性能方面的考虑
- 等待
- E500