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

Özellik Değer
Kural Kimliği CA2009
Başlık Bir ImmutableCollection değeri üzerinde ToImmutableCollection çağırma
Kategori Güvenilirlik
Hataya neden olan veya bozulmayan düzeltme Hataya neden olmayan
.NET 8'de varsayılan olarak etkin Öneri olarak

Neden

ToImmutable yöntemi, ad alanından System.Collections.Immutable sabit 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 giriş olarak yanlışlıkla sabit 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, aslında sabit bir koleksiyona sahip olduğunda, değiştirilebilir bir koleksiyon üzerinde çalıştığını varsayar.

İ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);
    }
}

Bahşiş

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

Code fix for CA2009 - Do not call ToImmutableCollection on an ImmutableCollection value

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.