C# 调用ArrayPool.Resize后,如何使用对旧数组的引用?

C# 调用ArrayPool.Resize后,如何使用对旧数组的引用?,c#,.net,memory-management,C#,.net,Memory Management,Windows高性能软件包包括Resize,它可以调整从System.Buffers.ArrayPool租用的阵列的大小 最后,他们提到了以下警告: 当此方法返回时,调用方不得使用对的任何引用 旧阵列不再存在了 我想知道是否有一个代码示例会使用前面的引用,这样我就可以避免这样的使用。 例如,此代码是否使用对旧数组的引用 T[] myPool; public void Add(T item) { if(Length >= myPool.Length) ArrayPoo

Windows高性能软件包包括Resize,它可以调整从System.Buffers.ArrayPool租用的阵列的大小

最后,他们提到了以下警告:

当此方法返回时,调用方不得使用对的任何引用 旧阵列不再存在了

我想知道是否有一个代码示例会使用前面的引用,这样我就可以避免这样的使用。 例如,此代码是否使用对旧数组的引用

T[] myPool;
public void Add(T item)
{
    if(Length >= myPool.Length)
        ArrayPool<T>.Shared.Resize(ref myPool, myPool.Length*2);
    myPool[Length++] = item;
}
T[]myPool;
公共作废新增(T项)
{
如果(长度>=myPool.Length)
ArrayPool.Shared.Resize(参考myPool,myPool.Length*2);
myPool[Length++]=项目;
}

不,不是。这是因为
ref myPool
正在更改
myPool
。如果您执行了
var oldArray=myPool
,然后又使用了
oldArray
,这将是一个不允许的模式示例。更现实地说,
myPool
可以在调用
Resize
之前被传递到一个方法或存储在某个地方。请注意,这个方法本质上是租用一个新数组,复制现有数据并将旧的数据返回到池中(没有神秘的就地扩展)。这也解释了为什么不能使用原始引用。