List.Add方法内部

问题描述

大多数C#开发人员都知道,System.Collections.Generic包含List类。该类公开Add方法,该方法的实现如下:

[__DynamicallyInvokable]
public void Add(T item)
{
    if (this._size == this._items.Length)
    {
        this.EnsureCapacity(this._size + 1);
    }
    T[] arg_36_0 = this._items;
    int size = this._size;
    this._size = size + 1;
    arg_36_0[size] = item;
    this._version++;
}

我试图了解其工作原理... 我有一个T类型的本地数组,称为“ _items”,也有“ _size”和“ _version”变量。当添加新项目时,将创建一个新的类型为T的数组,称为“ arg_36_0”,将私有数组分配给该新数组。尺寸被复制;然后增加本地大小,并为新创建的数组分配传递的新项目。 因此,此函数完成后,将删除本地“ arg_36_0”数组,该项目将永远不会分配给实际数组(称为“ _items”)。我在这里想念什么? :)

解决方法

您缺少引用类型的语义。

arg_36_0[size] = item;

只会创建一个对完全相同的数组的新引用。

引用类型的要点是,您对这些引用之一进行的操作都会反映在所有引用上。

因此int size = this._size; this._size = size + 1; this._items[size] = item; // set the last element in the array this._version++; 将更改基础数组。您也可以这样写:

class MyClass
{
    int MyProperty { get; set; }
}

想象一下,您将有一个像这样的课程:

var a = new MyClass();

并创建一个实例:

a

如果您现在对该对象引入第二个引用,您将在bvar b = a; b.MyProperty = 3; // this changes the underlying object and thus is reflected in a also Console.WriteLine(a.MyProperty); // prints 3 上看到更改:

{{1}}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...