Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
| Vlastnost | Hodnota |
|---|---|
| Název typu | PřesměrováníTokenuZrušeníNaVolání |
| ID pravidla | CA2016 |
| Název | Přeposlat parametr CancellationToken metodám, které ho přijmou |
| Kategorie | Spolehlivost |
| Oprava, která může být destruktivní nebo nedestruktivní | Nezlomitelný |
| Povoleno ve výchozím nastavení v .NET 10 | Jako návrh |
| Příslušné jazyky | C# a Visual Basic |
Příčina
Toto pravidlo vyhledá vyvolání metody, které by mohly přijmout CancellationToken parametr, ale žádný nepředávají, a navrhuje předat hodnotu nadřazeného parametru CancellationToken jim.
Popis pravidla
Toto pravidlo analyzuje definice metod, které mají CancellationToken jako svůj poslední parametr, a poté analyzuje všechny metody volané v jejich 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 je typ CancellationToken dostupný. Informace o příslušných verzích najdete v části 'Platí pro' pro CancellationToken.
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 v jazyce C# (Nothing v jazyce Visual Basic) nebo None k potlačení 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 ct z MyMethod do MyMethodWithDefault volání, protože metoda definuje volitelný token parametr:
using System.Threading;
namespace ConsoleApp
{
public static class MyTestClass
{
public static void MyMethodWithDefault(CancellationToken ct = default)
{
}
public static void MyMethod(CancellationToken ct)
{
MyMethodWithDefault();
}
}
}
Opravit:
Přeposlání parametru ct :
public static void MyMethod(CancellationToken ct)
{
MyMethodWithDefault(ct);
}
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 ct)
{
MyMethodWithDefault(default);
}
Nebo explicitně předat CancellationToken.None:
public static void MyMethod(CancellationToken ct)
{
MyMethodWithDefault(CancellationToken.None);
}
Příklad 2
Pravidlo navrhne předání parametru ct z MyMethod do vyvolání MyMethodWithOverload, protože metoda má přetížení, které přijímá parametr CancellationToken.
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();
}
}
}
Opravit:
Přeposlání parametru ct :
public static void MyMethod(CancellationToken ct)
{
MyMethodWithOverload(ct);
}
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 ct)
{
MyMethodWithOverload(default);
}
Nebo explicitně předat CancellationToken.None:
public static void MyMethod(CancellationToken ct)
{
MyMethodWithOverload(CancellationToken.None);
}
Příklady neporušení
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 ct, 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 ct)
{
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 ct)
{
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 ct1, CancellationToken ct2)
{
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 ct1 = default, CancellationToken ct2 = default)
{
}
public static void MyMethod(CancellationToken ct)
{
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 ct1, CancellationToken ct2)
{
}
public static void MyMethodWithOverload()
{
}
public static void MyMethod(CancellationToken ct)
{
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.