Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
| Tulajdonság | Érték |
|---|---|
| Szabályazonosító | CA2012 |
| Cím | ValueTasks helyes használata |
| Kategória | Megbízhatóság |
| A javítás kompatibilitástörő vagy nem törik | Nem törés |
| Alapértelmezés szerint engedélyezve a .NET 10-ben | Javaslatként |
Ok
A ValueTask tagok meghívásából visszaadott példányok olyan módon használhatók, amely kivételeket, sérülést vagy gyenge teljesítményt eredményezhet.
Szabály leírása
ValueTask a tagok meghívásából visszaadott példányokat közvetlenül várják. A ValueTask többszöri felhasználására vagy az eredmény közvetlen elérésére tett kísérletek az ismert befejezés előtt kivételt vagy sérülést okozhatnak. Az ilyen ValueTask figyelmen kívül hagyása valószínűleg egy funkcionális hiba jele, és ronthatja a teljesítményt.
Szabálysértések kijavítása
Általánosságban elmondható, hogy az Értéktaskokat közvetlenül kell várni ahelyett, hogy elvetnék vagy más helyekre, például helyi változókba vagy mezőkbe tárolnák.
Mikor kell letiltani a figyelmeztetéseket?
Az tetszőleges taghívásokból visszaadott objektumok esetében ValueTask a hívónak azt kell feltételeznie, hogy a ValueTask használatban kell lennie (például várnia kell) egyszer és csak egyszer. Ha azonban a fejlesztő a meghívandó tagot is vezérli, és teljes körű ismeretekkel rendelkezik a megvalósításról, a fejlesztő biztos lehet abban, hogy a figyelmeztetést nyugodtan letilthatja, például ha a visszatérés ValueTask mindig körbefut egy Task objektumon.
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;
// ...
}
}
Figyelmeztetés mellőzése
Ha csak egyetlen szabálysértést szeretne letiltani, adjon hozzá előfeldolgozási irányelveket a forrásfájlhoz a szabály letiltásához és újbóli engedélyezéséhez.
#pragma warning disable CA2012
// The code that's violating the rule is on this line.
#pragma warning restore CA2012
Ha le szeretné tiltani egy fájl, mappa vagy projekt szabályát, állítsa annak súlyosságát none a konfigurációs fájlban.
[*.{cs,vb}]
dotnet_diagnostic.CA2012.severity = none
További információ: Kódelemzési figyelmeztetések letiltása.