【C#】値型と参照型でのList.Clearの処理の違い

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って思っていたより軽い処理なんですね。今後はもっと気軽に使っていこうと思いました。

コメント

タイトルとURLをコピーしました