gpt4 book ai didi

c# - 正确使用 ArrayPool 和引用类型

转载 作者:太空狗 更新时间:2023-10-29 23:04:55 27 4
gpt4 key购买 nike

将 ArrayPool 与引用类型一起使用的正确方法是什么?

我假设它会充满刚刚使用默认构造函数“更新”的对象。

例如,在下面的代码中,当您第一次从 ArrayPool 中租用时,所有的 Foobars 都是空的。

2 个问题:

  1. 由于.Rent返回的对象一开始都是null,是否需要先用初始化对象填充数组池?

  2. 归还租用元素时,是否需要清空每件元素?例如,foobar.Name = null; foob​​ar.Place = null 等...

public class Program
{
public class Foobar {
public string Name {get;set;}
public string Place {get;set;}
public int Index {get;set;}
}

public static void Main()
{
ArrayPool<Foobar> pool = ArrayPool<Foobar>.Shared;
var foobars = pool.Rent(5);
foreach(var foobar in foobars) {
// prints "true"
Console.WriteLine($"foobar is null? ans={foobar == null}");
}
}
}

最佳答案

Since the objects returned from .Rent are initially all null, do I need to fill up the array pool with initialized objects first?

不需要,不。但您可能至少应该对从数组返回的任何内容执行 null 检查。

I was assuming that it would be full of objects that were just 'newed up' with the default constructor.

没有。它们将是 default(T) - 即 null。您似乎将 ArrayPool 视为一个对象池。没错,但主要是数组池。 主要是试图避免分配和取消分配数组(不是数组内的对象)的开销。

When returning the rented objects do I need to clear each object?

不需要,不。这些不是关于您是否应该的通用答案 - 这取决于您的具体问题空间。

returning到池中,您可以指示是否应清除数据。如果您不想将数据存储在池中,我建议传递 true 作为 clearArray 的值。

clearArray Boolean

Indicates whether the contents of the buffer should be cleared before reuse. If clearArray is set to true, and if the pool will store the buffer to enable subsequent reuse, the Return(T[], Boolean) method will clear the array of its contents so that a subsequent caller using the Rent(Int32) method will not see the content of the previous caller. If clearArray is set to false or if the pool will release the buffer, the array's contents are left unchanged.

或者,您可以在调用 Return 之前自行清除缓冲区。我还建议阅读 this link .

如果您希望池包含对象(以避免再次新建它们的成本)您可以这样做 - 但要确保您将 clearArray 设置为 false(或保留其默认值)。

关于c# - 正确使用 ArrayPool<T> 和引用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57367161/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com