CA2016: de parameter CancellationToken doorsturen naar methoden die één methode gebruiken
Eigenschappen | Weergegeven als |
---|---|
Typenaam | ForwardCancellationTokenToInvocations |
Regel-id | CA2016 |
Titel | De parameter CancellationToken doorsturen naar methoden die er één gebruiken |
Categorie | Betrouwbaarheid |
Oplossing is brekend of niet-brekend | Niet-brekend |
Standaard ingeschakeld in .NET 9 | Als suggestie |
Oorzaak
Met deze regel worden methode-aanroepen gevonden die een CancellationToken parameter kunnen accepteren, maar die geen parameter doorgeven, en wordt voorgesteld om de bovenliggende methode CancellationToken
naar hen door te sturen.
Beschrijving van regel
Deze regel analyseert methodedefinities die een CancellationToken
als laatste parameter gebruiken en analyseert vervolgens alle methoden die in de hoofdtekst worden aangeroepen. Als een van de methodeaanroepen een CancellationToken
als laatste parameter kan accepteren of een overbelasting heeft die als CancellationToken
laatste parameter wordt gebruikt, stelt de regel voor dat deze optie wordt gebruikt om ervoor te zorgen dat de annuleringsmelding wordt doorgegeven aan alle bewerkingen die ernaar kunnen luisteren.
Notitie
Regel CA2016 is beschikbaar in alle .NET-versies waar het CancellationToken
type beschikbaar is. Zie de sectie CancellationToken 'Van toepassing op' voor de toepasselijke versies.
Schendingen oplossen
U kunt schendingen handmatig oplossen of de codeoplossing gebruiken die beschikbaar is in Visual Studio. Beweeg de muisaanwijzer over de gloeilamp die naast de aanroep van de methode wordt weergegeven en selecteer de voorgestelde wijziging.
In het volgende voorbeeld ziet u twee voorgestelde wijzigingen:
Het is veilig om een schending van deze regel te onderdrukken als u zich geen zorgen maakt over het doorsturen van de melding voor geannuleerde bewerkingen naar lagere methode aanroepen. U kunt ook expliciet C# (Nothing
in Visual Basic) doorgeven default
of None de regelschending onderdrukken.
De regel kan verschillende schendingen detecteren. In de volgende voorbeelden ziet u gevallen die door de regel kunnen worden gedetecteerd:
Voorbeeld 1
De regel stelt voor om de c
parameter door te sturen naar MyMethod
de MyMethodWithDefault
aanroep, omdat de methode een optionele tokenparameter definieert:
using System.Threading;
namespace ConsoleApp
{
public static class MyTestClass
{
public static void MyMethodWithDefault(CancellationToken ct = default)
{
}
public static void MyMethod(CancellationToken c)
{
MyMethodWithDefault();
}
}
}
Oplossing:
c
De parameter doorsturen:
public static void MyMethod(CancellationToken c)
{
MyMethodWithDefault(c);
}
Als u zich geen zorgen maakt over het doorsturen van annuleringsmeldingen naar lagere aanroepen, kunt u het volgende doen:
Expliciet doorgeven default
:
public static void MyMethod(CancellationToken c)
{
MyMethodWithDefault(default);
}
Of expliciet doorgeven CancellationToken.None
:
public static void MyMethod(CancellationToken c)
{
MyMethodWithDefault(CancellationToken.None);
}
Voorbeeld 2
De regel stelt voor om de c
parameter van MyMethod
naar de MyMethodWithOverload
aanroep door te sturen, omdat de methode een overbelasting heeft die een CancellationToken
parameter gebruikt:
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();
}
}
}
Oplossing:
c
De parameter doorsturen:
public static void MyMethod(CancellationToken c)
{
MyMethodWithOverload(c);
}
Als u zich geen zorgen maakt over het doorsturen van annuleringsmeldingen naar lagere aanroepen, kunt u het volgende doen:
Expliciet doorgeven default
:
public static void MyMethod(CancellationToken c)
{
MyMethodWithOverload(default);
}
Of expliciet doorgeven CancellationToken.None
:
public static void MyMethod(CancellationToken c)
{
MyMethodWithOverload(CancellationToken.None);
}
Voorbeelden van niet-schending
De CancellationToken
parameter in de bovenliggende methode bevindt zich niet op de laatste positie:
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();
}
}
}
De CancellationToken
parameter in de standaardmethode bevindt zich niet op de laatste positie:
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();
}
}
}
De CancellationToken
parameter in de overbelastingsmethode bevindt zich niet op de laatste positie:
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();
}
}
}
De bovenliggende methode definieert meer dan één CancellationToken
parameter:
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();
}
}
}
De methode met standaardwaarden definieert meer dan één CancellationToken
parameter:
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();
}
}
}
De overbelasting van de methode definieert meer dan één CancellationToken
parameter:
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();
}
}
}
Een waarschuwing onderdrukken
Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.
#pragma warning disable CA2016
// The code that's violating the rule is on this line.
#pragma warning restore CA2016
Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst none
ervan in op het configuratiebestand.
[*.{cs,vb}]
dotnet_diagnostic.CA2016.severity = none
Zie Codeanalysewaarschuwingen onderdrukken voor meer informatie.