Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
| Właściwości | Wartość |
|---|---|
| Identyfikator reguły | CA2012 |
| Tytuł | Poprawnie używaj elementów ValueTask |
| Kategoria | Niezawodność |
| Poprawka powodująca niezgodność lub niezgodność | Niezgodność |
| Domyślnie włączone na platformie .NET 10 | Jako sugestia |
Przyczyna
Wystąpienie ValueTask zwrócone z wywołania elementu członkowskiego jest używane w sposób, który może prowadzić do wyjątków, uszkodzenia lub niskiej wydajności.
Opis reguły
ValueTask wystąpienia zwracane z wywołań składowych mają być bezpośrednio oczekiwane. Próby wielokrotnego korzystania z elementu ValueTask lub bezpośredniego uzyskania dostępu do wyniku, zanim wiadomo, że zostanie ukończone, mogą spowodować wyjątek lub uszkodzenie. Ignorowanie takiej wartościTask jest prawdopodobnie wskazaniem usterki funkcjonalnej i może obniżyć wydajność.
Jak naprawić naruszenia
Ogólnie rzecz biorąc, funkcja ValueTasks powinna być bezpośrednio oczekiwana, a nie odrzucana lub przechowywana w innych lokalizacjach, takich jak zmienne lokalne lub pola.
Kiedy pomijać ostrzeżenia
W przypadku ValueTask obiektów zwracanych z dowolnych wywołań składowych obiekt wywołujący musi przyjąć, że ValueTask element musi być używany (na przykład oczekiwany) raz i tylko raz. Jeśli jednak deweloper kontroluje również wywoływany element członkowski i ma pełną wiedzę na temat jego implementacji, deweloper może wiedzieć, że można bezpiecznie pominąć ostrzeżenie, na przykład jeśli zwracany ValueTask element zawsze opakowuje Task obiekt.
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;
// ...
}
}
Pomijanie ostrzeżenia
Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.
#pragma warning disable CA2012
// The code that's violating the rule is on this line.
#pragma warning restore CA2012
Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.
[*.{cs,vb}]
dotnet_diagnostic.CA2012.severity = none
Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.