CA2016: Předání parametru CancellationToken metodám, které berou jeden
Vlastnost | Hodnota |
---|---|
Název typu | ForwardCancellationTokenToInvocations |
ID pravidla | CA2016 |
Název | Přeposlat parametr CancellationToken metodám, které ho přijmou |
Kategorie | Spolehlivost |
Oprava způsobující chybu nebo chybu způsobující chybu | Nenarušující |
Povoleno ve výchozím nastavení v .NET 9 | Jako návrh |
Příčina
Toto pravidlo vyhledá vyvolání metody, které by mohly přijmout CancellationToken parametr, ale nepředají žádné, a navrhuje předat nadřazenou metodu CancellationToken
jim.
Popis pravidla
Toto pravidlo analyzuje definice metody, které jako poslední parametr přebírají CancellationToken
, a pak analyzuje všechny metody vyvolané v těle. Pokud některá z vyvolání metody může buď přijmout CancellationToken
jako poslední parametr, nebo mít přetížení, které přebírá CancellationToken
jako poslední parametr, pak pravidlo navrhne použití této možnosti, aby se zajistilo, že se oznámení o zrušení rozšíří do všech operací, které ho mohou poslouchat.
Poznámka:
Pravidlo CA2016 je k dispozici ve všech verzích .NET, ve kterých CancellationToken
je typ dostupný. Informace o příslušných verzích najdete v části CancellationToken "Platí pro".
Jak opravit porušení
Porušení můžete opravit ručně nebo můžete použít opravu kódu dostupnou v sadě Visual Studio. Najeďte myší na žárovku, která se zobrazí vedle vyvolání metody, a vyberte navrženou změnu.
Následující příklad ukazuje dvě navrhované změny:
Je bezpečné potlačit porušení tohoto pravidla, pokud vás nezajímá přesměrování oznámení o zrušené operaci na volání nižší metody. Můžete také explicitně předat default
jazyk C# (Nothing
v jazyce Visual Basic) nebo None potlačit porušení pravidla.
Pravidlo může detekovat různá porušení. Následující příklady ukazují případy, které pravidlo dokáže rozpoznat:
Příklad 1
Pravidlo navrhne předání parametru c
MyMethod
z MyMethodWithDefault
vyvolání, protože metoda definuje volitelný parametr tokenu:
using System.Threading;
namespace ConsoleApp
{
public static class MyTestClass
{
public static void MyMethodWithDefault(CancellationToken ct = default)
{
}
public static void MyMethod(CancellationToken c)
{
MyMethodWithDefault();
}
}
}
Opravit:
Přeposlání parametru c
:
public static void MyMethod(CancellationToken c)
{
MyMethodWithDefault(c);
}
Pokud vás nezajímá přesměrování oznámení o zrušení na nižší počet volání, můžete:
Explicitní předání default
:
public static void MyMethod(CancellationToken c)
{
MyMethodWithDefault(default);
}
Nebo explicitně předat CancellationToken.None
:
public static void MyMethod(CancellationToken c)
{
MyMethodWithDefault(CancellationToken.None);
}
Příklad 2
Pravidlo navrhne předání parametru c
MyMethod
z MyMethodWithOverload
vyvolání, protože metoda má přetížení, které přebírá CancellationToken
parametr:
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();
}
}
}
Opravit:
Přeposlání parametru c
:
public static void MyMethod(CancellationToken c)
{
MyMethodWithOverload(c);
}
Pokud vás nezajímá přesměrování oznámení o zrušení na nižší počet volání, můžete:
Explicitní předání default
:
public static void MyMethod(CancellationToken c)
{
MyMethodWithOverload(default);
}
Nebo explicitně předat CancellationToken.None
:
public static void MyMethod(CancellationToken c)
{
MyMethodWithOverload(CancellationToken.None);
}
Příklady porušení předpisů
Parametr CancellationToken
v nadřazené metodě není na poslední pozici:
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();
}
}
}
Parametr CancellationToken
ve výchozí metodě není na poslední pozici:
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();
}
}
}
Parametr CancellationToken
v metodě přetížení není na poslední pozici:
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();
}
}
}
Nadřazená metoda definuje více než jeden CancellationToken
parametr:
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();
}
}
}
Metoda s výchozími hodnotami definuje více než jeden CancellationToken
parametr:
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();
}
}
}
Přetížení metody definuje více než jeden CancellationToken
parametr:
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();
}
}
}
Potlačení upozornění
Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.
#pragma warning disable CA2016
// The code that's violating the rule is on this line.
#pragma warning restore CA2016
Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none
konfiguračním souboru.
[*.{cs,vb}]
dotnet_diagnostic.CA2016.severity = none
Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.