繁体   English   中英

List.Add() 方法内部

[英]List.Add() method internals

大多数 C# 开发人员都知道 System.Collections.Generic 包含列表 class。class 公开了 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”,将私有数组分配给新数组。 大小被复制; 然后局部大小增加,并且我们将传递的新项目分配给新创建的数组。 因此,在 function 完成后,本地“arg_36_0”数组将被删除,该项目永远不会分配给实际数组(称为“_items”)。 我在这里错过了什么? :)

您缺少引用类型语义。

T[] arg_36_0 = this._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:

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

并创建它的一个实例:

var a = new MyClass();

如果您现在引入对 object 的第二个引用,您会看到ab的变化:

var b = a;
b.MyProperty = 3; // this changes the underlying object and thus is reflected in a also
Console.WriteLine(a.MyProperty); // prints 3

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM