我们假设有这样的一个结构体。因为结构体是值类型的,在没有修饰的情况下,我们的方法中,传入,传出都是传递的值,每次传递都进行了一次值的拷贝。
所以,我们这样操作是不可行的。
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;
这样不可以的。
希望这样说,各位不明白的能明白。明白的更明白。
分享到:
相关推荐
Swift教程之集合类型详解主要关注的是Swift编程语言中两种核心的集合类型——数组和字典。数组是一种存储同类型元素的有序集合,而字典则是一个无序的键值对集合,通过唯一的键来访问对应的值。 数组在Swift中扮演...
### Java集合Collection、List、Set、Map使用详解 #### 1. 集合框架概述 集合框架是Java编程语言中最基本且最重要的组成部分之一。它提供了处理数据集合的强大工具,这些工具不仅支持基本操作(如添加、删除和查找...
### Python3基本数据类型详解 Python3作为一种广泛使用的高级编程语言,其强大的功能之一便是对各种数据类型的灵活处理。在Python3中,数据类型分为两大类:不可变数据类型和可变数据类型。不可变数据类型包括数字...
### Python中的List与Tuple #### List 在Python中,`list`是一种有序的数据集合,它支持多种操作,如追加、插入、删除等。列表的一个重要特性是它的灵活性——不仅能够容纳不同类型的元素(比如字符串、整数甚至是...
- 元组是一种不可变序列类型,类似于列表,但是一旦创建就无法修改。 - 示例: ```python tuple1 = (1, 2, 3) tuple2 = ('apple', 'banana', 'cherry') print(tuple1) print(tuple2) ``` - **Sets(集合)*...
### Python3中dict.keys()转换成list类型的方法详解 在Python3中,`dict.keys()`方法的使用方式与Python2存在显著差异。Python2中,`dict.keys()`返回的是一个包含字典所有键的列表,这使得我们可以直接通过索引来...
数据类型详解: 在计算机编程中,数据类型是定义变量可以存储的数据的种类。数据类型包括基础数据类型和复杂数据类型。 基础数据类型主要包括: 1. 整型(int):用于表示整数,如1, 2, 3等。 2. 布尔型(bool):用于...
在C++中,符号可以是变量、函数或对象等,编译器在遇到ambiguous symbol时,无法确定该符号的类型或作用域,需要开发者明确该符号的类型或作用域。 3. Argument list syntax error 参数表语法错误 在C++中,函数...
本篇文章将重点讨论单值类型集合中的两种常见形式——`List`和`Set`,并探讨它们之间的共同点与不同之处。 #### 共有特性与方法 - **父接口**:`List`和`Set`都继承自更高层级的接口`Collection`,这使得它们共享...
Python中的List列表是数据结构的一种,它允许存储多个数据项,并且这些数据项可以是不同类型的,如整数、字符串、浮点数甚至是其他列表。List列表是有序的,这意味着元素有特定的顺序,可以通过索引来访问它们。 1....
本资料“Java集合详解代码.zip”涵盖了Java集合框架的主要组成部分,包括List、Set、Map以及Collections工具类,通过代码实现来帮助理解和掌握这些概念。 1. **List接口**:List是有序的集合,允许重复元素,支持...
在Java编程中,List集合是Java集合框架的重要组成部分,它是一种有序的集合,可以存储重复的元素。本文将深入解析Java中对List集合的常用操作,帮助开发者更好地理解和使用List接口。 1. **添加、获取和删除元素** ...
`表示更新堆栈指针,即在执行指令后修改堆栈指针,`<Rlist>`是需要存储到堆栈中的寄存器列表。在满递减堆栈中,执行STMFD指令后,堆栈指针会减小,数据从高地址存储到低地址。 #### LDMFD (Load Multiple Full ...
### NTFS文件系统详解 #### 一、序言与文档概览 《NTFS文件系统详解》是一份技术文档,由Richard Russon和Yuval Fledel共同编写,旨在为程序员提供深入理解NTFS(New Technology File System)文件系统的资料。这...
### Python中的List常用操作详解 #### 一、概述 在Python编程中,`list`是一种非常重要的数据结构,它允许我们存储多个项在一个单一的变量里,并提供了多种实用的操作方式来处理这些数据。本篇文章将深入探讨...
11. **反射**:Java反射机制允许在运行时检查类、接口、字段和方法的信息,动态调用方法和修改字段值,是实现元编程的关键。 12. **JavaBeans**:JavaBeans是Java组件模型的一部分,用于创建可重用的组件,遵循特定...
此外,当元素类型为值类型时,List的性能接近于同类型的数组,因为没有了装箱和拆箱的开销。 总结一下,数组固定容量、高效访问,适用于已知且不会改变大小的数据集合。ArrayList提供动态大小调整,但类型不安全且...