CA2009: ImmutableCollection değerinde ToImmutableCollection çağrısı yapma

Özellik Değer
Kural Kimliği CA2009
Başlık ImmutableCollection değeri üzerinde ToImmutableCollection çağırmayın
Kategori Güvenilirlik
Düzeltme bozucu ya da bozmayan olabilir Kesintisiz
.NET 10'da varsayılan olarak etkin Öneri olarak
Geçerli diller C# ve Visual Basic

Neden

ToImmutable yöntemi, System.Collections.Immutable ad alanından değişmez bir koleksiyonda gereksiz yere çağrıldı.

Kural açıklaması

System.Collections.Immutable ad alanı, sabit koleksiyonları tanımlayan türler içerir. Bu kural aşağıdaki sabit koleksiyon türlerini analiz eder:

Bu türler, mevcut IEnumerable<T> bir koleksiyondan yeni sabit bir koleksiyon oluşturan uzantı yöntemlerini tanımlar.

Bu uzantı yöntemleri, değiştirilebilir bir koleksiyonu sabit bir koleksiyona dönüştürmek için tasarlanmıştır. Ancak çağıran, bu yöntemlere parametre olarak yanlışlıkla değiştirilemez bir koleksiyon geçirebilir. Bu, bir performansı ve/veya işlevsel bir sorunu temsil edebilir.

  • Performans sorunu: Gereksiz kutulama, kutu açma ve/veya çalışma zamanı türü sabit bir koleksiyon üzerinde denetimler gerçekleştirir.
  • Olası işlevsel sorun: Çağıranın, gerçekte sabit bir koleksiyon varken üzerinde çalıştığını varsaydığı şey değiştirilebilir bir koleksiyondu.

İhlalleri düzeltme

İhlalleri düzeltmek için sabit bir koleksiyondaki yedekli ToImmutable çağrıyı kaldırın. Örneğin, aşağıdaki iki kod parçacığı kuralın ihlalini ve bunların nasıl düzeltileceğini gösterir:

using System;
using System.Collections.Generic;
using System.Collections.Immutable;

public class C
{
    public void M(IEnumerable<int> collection, ImmutableArray<int> immutableArray)
    {
        // This is fine.
        M2(collection.ToImmutableArray());

        // This leads to CA2009.
        M2(immutableArray.ToImmutableArray());
    }

    private void M2(ImmutableArray<int> immutableArray)
    {
        Console.WriteLine(immutableArray.Length);
    }
}
using System;
using System.Collections.Generic;
using System.Collections.Immutable;

public class C
{
    public void M(IEnumerable<int> collection, ImmutableArray<int> immutableArray)
    {
        // This is fine.
        M2(collection.ToImmutableArray());

        // This is now fine.
        M2(immutableArray);
    }

    private void M2(ImmutableArray<int> immutableArray)
    {
        Console.WriteLine(immutableArray.Length);
    }
}

İpucu

Visual Studio'da bu kural için bir kod düzeltmesi kullanılabilir. Bunu kullanmak için imleci ihlalin üzerine getirin ve Ctrl+. (nokta) tuşuna basın. Sunulan seçenekler listesinden Yedek aramayı kaldır'ı seçin.

CA2009 için kod düzeltmesi - ImmutableCollection değerinde ToImmutableCollection çağrısı yapma

Uyarıların ne zaman bastırılması gerekiyor?

Sabit koleksiyonların gereksiz ayırmalarından kaynaklanan performans etkisinden endişe duymadığınız sürece, bu kuraldaki ihlalleri bastırmayın.

Uyarıyı gizleme

Yalnızca tek bir ihlali engellemek istiyorsanız, kuralı devre dışı bırakmak ve sonra yeniden etkinleştirmek için kaynak dosyanıza ön işlemci yönergeleri ekleyin.

#pragma warning disable CA2009
// The code that's violating the rule is on this line.
#pragma warning restore CA2009

Bir dosya, klasör veya projenin kuralını devre dışı bırakmak için, yapılandırma dosyasındaki önem derecesini noneolarak ayarlayın.

[*.{cs,vb}]
dotnet_diagnostic.CA2009.severity = none

Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.

Ayrıca bkz.