Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
| Proprietà | valore |
|---|---|
| ID regola | CA2012 |
| Title | Usare correttamente gli elementi ValueTask |
| Categoria | Affidabilità |
| La correzione causa un'interruzione o meno | Non rompente |
| Abilitato per impostazione predefinita in .NET 10 | Come suggerimento |
| Linguaggi applicabili | C# e Visual Basic |
Causa
Un'istanza ValueTask restituita da una chiamata a un membro viene utilizzata in modo che potrebbe causare eccezioni, corruzione o prestazioni scarse.
Descrizione regola
ValueTask Le istanze restituite dalle invocazioni dei membri devono essere attese direttamente. I tentativi di utilizzare un ValueTask più volte o di accedere direttamente al risultato di un ValueTask prima che sia noto che sia stato completato possono generare un'eccezione o una corruzione. Ignorare tale ValueTask è probabilmente un'indicazione di un bug funzionale e può compromettere le prestazioni.
Come correggere le violazioni
In generale, ValueTasks deve essere atteso direttamente anziché scartato o archiviato in altre posizioni, ad esempio variabili locali o campi.
Quando eliminare gli avvisi
Per ValueTask gli oggetti restituiti da chiamate di membri arbitrari, il chiamante deve presupporre che l'oggetto ValueTask deve essere utilizzato (ad esempio, atteso) una sola volta. Tuttavia, se lo sviluppatore controlla anche il membro richiamato e ha una conoscenza completa dell'implementazione, lo sviluppatore potrebbe sapere che è sicuro eliminare l'avviso, ad esempio se il ritorno ValueTask esegue sempre il wrapping di un Task oggetto.
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;
// ...
}
}
Eliminare un avviso
Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.
#pragma warning disable CA2012
// The code that's violating the rule is on this line.
#pragma warning restore CA2012
Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità none su nel file di configurazione.
[*.{cs,vb}]
dotnet_diagnostic.CA2012.severity = none
Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.