Megosztás a következőn keresztül:


CA2012: ValueTasks helyes használata

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.

Lásd még