正确使用 ArrayPool<T> 和引用类型
Proper usage of ArrayPool<T> with a reference type
将 ArrayPool 与引用类型一起使用的正确方法是什么?
我假设它会充满对象,这些对象只是 'newed up' 使用默认构造函数。
例如,在下面的代码中,当您第一次从 ArrayPool 中租用时,所有 Foobars
都为 null。
2 个问题:
由于.Rent
返回的对象一开始都是null,是否需要先用初始化对象填满数组池?
归还租借物品时,是否需要清空每件物品?例如,foobar.Name = null; foobar.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?
您不需要,不需要。这些不是关于您是否应该的通用答案 - 这取决于您的具体问题 space.
当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.
如果您希望 池包含对象(以避免new
再次调用它们的成本),您可以这样做 -但请确保将 clearArray
设置为 false
(或保留其默认值)。
将 ArrayPool 与引用类型一起使用的正确方法是什么?
我假设它会充满对象,这些对象只是 'newed up' 使用默认构造函数。
例如,在下面的代码中,当您第一次从 ArrayPool 中租用时,所有 Foobars
都为 null。
2 个问题:
由于
.Rent
返回的对象一开始都是null,是否需要先用初始化对象填满数组池?归还租借物品时,是否需要清空每件物品?例如,
foobar.Name = null; foobar.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?
您不需要,不需要。这些不是关于您是否应该的通用答案 - 这取决于您的具体问题 space.
当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.
如果您希望 池包含对象(以避免new
再次调用它们的成本),您可以这样做 -但请确保将 clearArray
设置为 false
(或保留其默认值)。