CA2016: CancellationToken parametresini bir tane alan yöntemlere iletin
Özellik | Değer |
---|---|
Tür adı | ForwardCancellationTokenToInvocations |
Kural Kimliği | CA2016 |
Başlık | CancellationToken parametresini, parametre alan metotlara iletin |
Kategori | Güvenilirlik |
Hataya neden olan veya bozulmayan düzeltme | Hataya neden olmayan |
.NET 9'da varsayılan olarak etkin | Öneri olarak |
Neden
Bu kural, parametre kabul edebilen ancak herhangi bir CancellationToken parametre geçirmeyen yöntem çağrılarını bulur ve üst yöntemin CancellationToken
çağrılarını 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:
İ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, C# (Nothing
Visual Basic'te) veya None kural ihlalini engellemek için açıkça geçirebilirsinizdefault
.
Kural çeşitli ihlalleri algılayabilir. Aşağıdaki örneklerde kuralın algılayabileceğiniz durumlar gösterilmektedir:
Örnek 1
yöntemi isteğe bağlı bir belirteç parametresi MyMethod
tanımladığından, kural parametresini MyMethodWithDefault
çağrısına iletmeyi c
önerir:
using System.Threading;
namespace ConsoleApp
{
public static class MyTestClass
{
public static void MyMethodWithDefault(CancellationToken ct = default)
{
}
public static void MyMethod(CancellationToken c)
{
MyMethodWithDefault();
}
}
}
Düzeltmek:
Parametresini iletin c
:
public static void MyMethod(CancellationToken c)
{
MyMethodWithDefault(c);
}
İptal bildirimlerini daha düşük çağrılara iletmekle ilgilenmiyorsanız şunlardan birini yapabilirsiniz:
Açıkça geçirin default
:
public static void MyMethod(CancellationToken c)
{
MyMethodWithDefault(default);
}
Veya açıkça geçirin CancellationToken.None
:
public static void MyMethod(CancellationToken c)
{
MyMethodWithDefault(CancellationToken.None);
}
Örnek 2
Yöntemin parametreyi MyMethod
alan CancellationToken
bir aşırı yükü olduğundan kural parametresinin MyMethodWithOverload
çağrıya iletilmesi c
önerisinde bulunuyor:
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 c)
{
MyMethodWithOverload();
}
}
}
Düzeltmek:
Parametresini iletin c
:
public static void MyMethod(CancellationToken c)
{
MyMethodWithOverload(c);
}
İptal bildirimlerini daha düşük çağrılara iletmekle ilgilenmiyorsanız şunlardan birini yapabilirsiniz:
Açıkça geçirin default
:
public static void MyMethod(CancellationToken c)
{
MyMethodWithOverload(default);
}
Veya açıkça geçirin CancellationToken.None
:
public static void MyMethod(CancellationToken c)
{
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 c, 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 c)
{
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 c)
{
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 c1, CancellationToken c2)
{
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 c1 = default, CancellationToken c2 = default)
{
}
public static void MyMethod(CancellationToken c)
{
MyMethodWithDefault();
}
}
}
Yöntem aşırı yüklemesi birden CancellationToken
fazla parametre tanımlar:
using System.Threading;
namespace ConsoleApp
{
public static class MyTestClass
{
public static void MyMethodWithOverload(CancellationToken c1, CancellationToken c2)
{
}
public static void MyMethodWithOverload()
{
}
public static void MyMethod(CancellationToken c)
{
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 none
olarak ayarlayın.
[*.{cs,vb}]
dotnet_diagnostic.CA2016.severity = none
Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.