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 |
|---|---|
| ID pravidla | CA2012 |
| Název | Správně použít hodnoty ValueTask |
| Kategorie | Spolehlivost |
| Oprava způsobující chybu nebo chybu způsobující chybu | Nenarušující |
| Povoleno ve výchozím nastavení v .NET 10 | Jako návrh |
Příčina
ValueTask Instance vrácená z volání člena se používá způsobem, který může vést k výjimkám, poškození nebo nízkému výkonu.
Popis pravidla
ValueTask Instance vrácené z volání členů mají být přímo očekávány. Pokusy o vícenásobné využití hodnoty ValueTask nebo přímý přístup k výsledku jednoho z nich dříve, než je známo, že je dokončen, může vést k výjimce nebo poškození. Ignorování takové hodnoty ValueTask pravděpodobně značí funkční chybu a může snížit výkon.
Jak opravit porušení
Obecně platí, že hodnoty ValueTasks by měly být přímo očekávány místo zahození nebo uložení do jiných umístění, jako jsou místní proměnné nebo pole.
Kdy potlačit upozornění
U ValueTask objektů vrácených z libovolných volání členů volající musí předpokládat, že ValueTask musí být spotřebováno (například očekáváno) jednou a pouze jednou. Pokud však vývojář také řídí vyvolání člena a má úplné znalosti o jeho implementaci, vývojář může vědět, že je bezpečné potlačit upozornění, například pokud vrácení ValueTask vždy zabalí Task objekt.
Example
public class NumberValueTask
{
public async ValueTask<int> GetNumberAsync()
{
await Task.Delay(100);
return 123;
}
public async Task UseValueTaskIncorrectlyAsync()
{
// This code violates the rule,
// because ValueTask is awaited multiple times
ValueTask<int> numberValueTask = GetNumberAsync();
int first = await numberValueTask;
int second = await numberValueTask; // <- illegal reuse
// ...
}
// This code satisfies the rule.
public async Task UseValueTaskCorrectlyAsync()
{
int first = await GetNumberAsync();
int second = await GetNumberAsync();
// ..
}
public async Task UseValueTaskAsTaskAsync()
{
ValueTask<int> numberValueTask = GetNumberAsync();
Task<int> numberTask = numberValueTask.AsTask();
int first = await numberTask;
int second = await numberTask;
// ...
}
}
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 CA2012
// The code that's violating the rule is on this line.
#pragma warning restore CA2012
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.CA2012.severity = none
Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.