c# - 列表与数组中的索引器

标签 c# value-type

索引器是如何在列表和数组中定义的。
List<MyStruct> lists=new List<MyStruct>();哪里MyStruct是一个结构。现在考虑MyStruct[] arr=new MyStruct[10];arr[0]给出对第一个结构项的引用。但是 lists[0]给我一份。
有什么理由这样做。
也因为 Int32是结构List<Int32> list1 =new List<Int32>();我如何访问 list1[0]或分配 list1[0]=5哪里不可能做 lists[0]._x=5

最佳答案

尽管它们看起来相同,但数组索引器和列表索引器在做完全不同的事情。
List<T> indexer 被声明为一个带有参数的属性:

public T this[int index] { get; set; }

这被编译为 get_Itemset_Item在访问参数时像任何其他方法一样调用的方法。

数组索引器在 CLR 中有直接支持;有一个特定的 IL 指令 ldelema (加载元素地址)用于获取指向数组第 n 个元素的托管指针。然后,任何其他 IL 指令都可以使用该指针,这些指令使用指针直接更改该地址处的事物。

例如,stfld (store field value) 指令可以使用一个托管指针来指定“this”实例来存储该字段,或者您可以使用该指针直接在数组中的事物上调用方法。

在 C# 中,数组索引器返回一个变量,而列表索引器返回一个值。

关于c# - 列表与数组中的索引器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6705583/

相关文章:

c# - 作为构建步骤,如何从解决方案中的项目之一运行程序?

c# - 从存储过程返回最后插入行的标识

c# - 调用值类型的方法

c# - 将枚举设置为其默认值

ios - 在 Swift 中从值类型的实例方法修改实例属性

c# - 无法为表中的标识列插入显式值

c# - 暂停/阻止复选框控件的动画

c# - DotNetOpenAuth - 如何使其在负载均衡器后面工作?

c# - 根据定义,值类型是不可变的吗?

c# - 值类型的对象扩展方法