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 causa un'interruzione |
| Abilitato per impostazione predefinita in .NET 10 | Come suggerimento |
Causa
Un'istanza ValueTask restituita da una chiamata a un membro viene usata in modo da causare eccezioni, danneggiamento o prestazioni scarse.
Descrizione regola
ValueTask Le istanze restituite dalle chiamate ai membri devono essere attese direttamente. I tentativi di utilizzare un valore ValueTask più volte o di accedere direttamente al risultato di uno prima che sia noto che venga completato possono causare un'eccezione o un danneggiamento. 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 e 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.