CA2016: CancellationToken parametresini bir tane alan yöntemlere iletin

Özellik Değer
Tür adı İptal Belirteçlerini Çağrılara İlet
Kural Kimliği CA2016
Başlık CancellationToken parametresini, parametre alan metotlara iletin
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

Bu kural, CancellationToken parametresini kabul edebilen ancak herhangi birini geçirmeyen yöntem çağrılarını bulur ve ebeveyn yöntemin CancellationToken parametresini onlara iletmeyi önerir.

Kural açıklaması

Bu kural, son parametresi olarak bir CancellationToken alan yöntem tanımlarını analiz eder ve ardından gövdesinde çağrılan tüm yöntemleri analiz eder. Yöntem çağrılarından herhangi biri son parametre olarak bir CancellationToken kabul edebilirse veya son parametre olarak a CancellationToken alan bir aşırı yüklemeye sahipse, kural iptal bildiriminin bunu dinleyebilen tüm işlemlere yayılmasını sağlamak için bu seçeneğin kullanılmasını önerir.

Not

Kural CA2016, türün kullanılabildiği CancellationToken tüm .NET sürümlerinde kullanılabilir. Geçerli sürümler için CancellationToken "Şunlar için geçerlidir" bölümüne bakın.

İhlalleri düzeltme

İhlalleri el ile düzeltebilir veya Visual Studio'da bulunan kod düzeltmesini kullanabilirsiniz. Yöntem çağrısının yanında görünen ampulün üzerine gelin ve önerilen değişikliği seçin.

Aşağıdaki örnekte önerilen iki değişiklik gösterilmektedir:

Kural CA2016 - CancellationToken parametresini bir tane alan yöntemlere iletme

İptal edilen işlem bildirimini daha düşük yöntem çağrılarına iletmekle ilgilenmiyorsanız, bu kuralın ihlalini gizlemeniz güvenlidir. Ayrıca, kural ihlalini engellemek için C# dilinde default, Visual Basic dilinde Nothing veya None açıkça geçirebilirsiniz.

Kural çeşitli ihlalleri algılayabilir. Aşağıdaki örneklerde kuralın algılayabileceğiniz durumlar gösterilmektedir:

Örnek 1

yöntem isteğe bağlı bir belirteç parametresi tanımladığından, kural ct parametresinin MyMethod'den MyMethodWithDefault çağrısına iletilmesini önerir.

using System.Threading;

namespace ConsoleApp
{
    public static class MyTestClass
    {
        public static void MyMethodWithDefault(CancellationToken ct = default)
        {
        }

        public static void MyMethod(CancellationToken ct)
        {
            MyMethodWithDefault();
        }
    }
}

Düzeltme:

Parametresini iletin ct :

public static void MyMethod(CancellationToken ct)
{
    MyMethodWithDefault(ct);
}

İptal bildirimlerini daha düşük çağrılara iletmekle ilgilenmiyorsanız şunlardan birini yapabilirsiniz:

Açıkça iletin default:

public static void MyMethod(CancellationToken ct)
{
    MyMethodWithDefault(default);
}

Veya açıkça geçirin CancellationToken.None:

public static void MyMethod(CancellationToken ct)
{
    MyMethodWithDefault(CancellationToken.None);
}

Örnek 2

Kural, yöntemin CancellationToken parametresi alan bir aşırı yüklemesi olduğu için ct parametresinin MyMethod'den MyMethodWithOverload çağrısına iletilmesini önerir.

using System.Threading;

namespace ConsoleApp
{
    public static class MyTestClass
    {
        public static void MyMethodWithOverload()
        {
        }

        public static void MyMethodWithOverload(CancellationToken ct = default)
        {
        }

        public static void MyMethod(CancellationToken ct)
        {
            MyMethodWithOverload();
        }
    }
}

Düzeltme:

Parametresini iletin ct :

public static void MyMethod(CancellationToken ct)
{
    MyMethodWithOverload(ct);
}

İptal bildirimlerini daha düşük çağrılara iletmekle ilgilenmiyorsanız şunlardan birini yapabilirsiniz:

Açıkça belirtin default:

public static void MyMethod(CancellationToken ct)
{
    MyMethodWithOverload(default);
}

Veya açıkça geçirin CancellationToken.None:

public static void MyMethod(CancellationToken ct)
{
    MyMethodWithOverload(CancellationToken.None);
}

İhlal dışı örnekler

CancellationToken Üst yöntemdeki parametre son konumda değil:

using System.Threading;

namespace ConsoleApp
{
    public static class MyTestClass
    {
        public static void MyMethodWithDefault(CancellationToken ct = default)
        {
        }

        public static void MyMethod(CancellationToken ct, int lastParameter)
        {
            MyMethodWithDefault();
        }
    }
}

CancellationToken Varsayılan yöntemdeki parametre son konumda değil:

using System.Threading;

namespace ConsoleApp
{
    public static class MyTestClass
    {
        public static void MyMethodWithDefault(CancellationToken ct = default, int lastParameter = 0)
        {
        }

        public static void MyMethod(CancellationToken ct)
        {
            MyMethodWithDefault();
        }
    }
}

CancellationToken Aşırı yükleme yöntemindeki parametresi son konumda değil:

using System.Threading;

namespace ConsoleApp
{
    public static class MyTestClass
    {
        public static void MyMethodWithOverload(int lastParameter)
        {
        }
        public static void MyMethodWithOverload(CancellationToken ct, int lastParameter)
        {
        }

        public static void MyMethod(CancellationToken ct)
        {
            MyMethodWithOverload();
        }
    }
}

Üst yöntem birden CancellationToken fazla parametre tanımlar:

using System.Threading;

namespace ConsoleApp
{
    public static class MyTestClass
    {
        public static void MyMethodWithDefault(CancellationToken ct = default)
        {
        }

        public static void MyMethod(CancellationToken ct1, CancellationToken ct2)
        {
            MyMethodWithDefault();
        }
    }
}

Varsayılan değerleri olan yöntem birden CancellationToken fazla parametre tanımlar:

using System.Threading;

namespace ConsoleApp
{
    public static class MyTestClass
    {
        public static void MyMethodWithDefault(CancellationToken ct1 = default, CancellationToken ct2 = default)
        {
        }

        public static void MyMethod(CancellationToken ct)
        {
            MyMethodWithDefault();
        }
    }
}

Bir yöntem aşırı yüklemesi, birden fazla CancellationToken parametre tanımlar.

using System.Threading;

namespace ConsoleApp
{
    public static class MyTestClass
    {
        public static void MyMethodWithOverload(CancellationToken ct1, CancellationToken ct2)
        {
        }

        public static void MyMethodWithOverload()
        {
        }

        public static void MyMethod(CancellationToken ct)
        {
            MyMethodWithOverload();
        }
    }
}

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 CA2016
// The code that's violating the rule is on this line.
#pragma warning restore CA2016

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.CA2016.severity = none

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