List.Clearメソッドは、そのリストの中身が値型か参照型かによって処理が異なります。
中身が値型の場合はCountを0にするだけで終了なのに対し、参照型の場合は、それに加えて中身の配列に対するArray.Clearが実行されます。
public void Clear()
{
_version++;
if (RuntimeHelpers.IsReferenceOrContainsReferences<T>())
{
// Tが参照型のとき
int size = _size;
_size = 0;
if (size > 0)
{
Array.Clear(_items, 0, size); // Clear the elements so that the gc can reclaim the references.
}
}
else
{
// Tが値型のとき
_size = 0;
}
}
runtime/src/libraries/System.Private.CoreLib/src/System/Collections/Generic/List.cs at 96be3e2e811c008c372a5d4cc59f0142f1d85375 · dotnet/runtime
.NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps. - dotnet/runtime
これが意味するのは、参照型の場合はList.Clearの実行にO(n)の計算がかかるのに対し、値型の場合はO(1)で済むということです。
中身が値型のときのList.Clearって思っていたより軽い処理なんですね。今後はもっと気軽に使っていこうと思いました。
コメント