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


CA2208: Argumentum-kivételek helyes példányosítása

Tulajdonság Érték
Szabályazonosító CA2208
Cím Argumentum-kivételek helyes példányosítása
Kategória Használat
A javítás kompatibilitástörő vagy nem törik Nem törés
Alapértelmezés szerint engedélyezve a .NET 8-ban Javaslatként

Ok

Ha egy metódus paraméterrel rendelkezik, és olyan kivételtípust ad ki, amelyből származik vagy származik, ArgumentExceptionakkor egy konstruktornak megfelelően kell meghívnia egy paramétert elfogadó konstruktort paramName . A lehetséges okok közé tartoznak a következő helyzetek:

  • Egy olyan kivételtípus alapértelmezett (paraméter nélküli) konstruktorának hívása történik, amely egy paramétert elfogadó paramName konstruktorsal is rendelkezik. ArgumentException
  • A rendszer helytelen sztringargumentumot ad át egy olyan kivételtípus paraméteres konstruktorának, amely vagy amelyből származik. ArgumentException
  • A paraméter egyik neve a message kivételtípus konstruktorának argumentuma, amely a következőből származik vagy származik: ArgumentException.

Szabály leírása

Az alapértelmezett konstruktor meghívása helyett hívja meg az egyik konstruktor túlterhelését, amely lehetővé teszi, hogy értelmesebb kivételüzenetet adjon meg. A kivételüzenetnek a fejlesztőre kell irányulnia, és egyértelműen meg kell magyaráznia a hibafeltételt, valamint a kivétel kijavításának vagy elkerülésének módját.

Az egy és két sztring konstruktorának ArgumentException és származtatott típusainak aláírásai nem összhangban vannak a pozícióval message és paramName a paraméterekkel. Győződjön meg arról, hogy ezek a konstruktorok a megfelelő sztringargumentumokkal vannak meghívva. Az aláírások a következők:

Szabálysértések kijavítása

A szabály megsértésének kijavításához hívjon meg egy olyan konstruktort, amely üzenetet, paraméternevet vagy mindkettőt használ, és győződjön meg arról, hogy az argumentumok megfelelőek a meghívott típushoz ArgumentException .

Tipp.

A Visual Studióban kódjavítás érhető el a helytelenül elhelyezett paraméternevekhez. A használatához helyezze a kurzort a figyelmeztető sorra, és nyomja le a Ctrl+ billentyűt. (pont). Válassza az argumentumok sorrendjének felcserélése lehetőséget a megjelenő lehetőségek listájából.

A CA2208 kódjavítása – argumentumok felcserélése.

Ha üzenet helyett paraméternevet ad át a ArgumentException(String) metódusnak, a javító lehetővé teszi, hogy inkább a két argumentumos konstruktorra váltson.

A CA2208 kódjavítása – váltás kétargumentumos konstruktorra.

Mikor kell letiltani a figyelmeztetéseket?

A szabály figyelmeztetését csak akkor lehet letiltani, ha egy paraméteres konstruktort a megfelelő sztringargumentumokkal hív meg.

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 CA2208
// The code that's violating the rule is on this line.
#pragma warning restore CA2208

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.CA2208.severity = none

További információ: Kódelemzési figyelmeztetések letiltása.

Kód konfigurálása elemzéshez

A következő beállítással konfigurálhatja, hogy a kódbázis mely részein futtassa ezt a szabályt.

Ezt a beállítást konfigurálhatja csak ehhez a szabályhoz, az összes szabályhoz, vagy az ebben a kategóriában (Tervezés) szereplő összes szabályhoz, amelyekre vonatkozik. További információ: Kódminőségi szabály konfigurációs beállításai.

Adott API-felületek belefoglalása

A kódbázis azon részeit konfigurálhatja, amelyeken futtathatja ezt a szabályt az akadálymentességük alapján. Ha például meg szeretné adni, hogy a szabály csak a nem nyilvános API-felületen fusson, adja hozzá a következő kulcs-érték párot a projekt egyik .editorconfig fájljához:

dotnet_code_quality.CAXXXX.api_surface = private, internal

Alapértelmezés szerint a CA2208 szabály minden API-felületre (nyilvános, belső és privát) érvényes.

Példa

Az alábbi kód egy konstruktort mutat be, amely helytelenül példányosítja a példányt ArgumentNullException.

public class Book
{
    public Book(string title)
    {
        Title = title ??
            throw new ArgumentNullException("All books must have a title.", nameof(title));
    }

    public string Title { get; }
}
Public Class Book

    Private ReadOnly _Title As String

    Public Sub New(ByVal title As String)
        ' Violates this rule (constructor arguments are switched)            
        If (title Is Nothing) Then
            Throw New ArgumentNullException("title cannot be a null reference (Nothing in Visual Basic)", "title")
        End If
        _Title = title
    End Sub

    Public ReadOnly Property Title()
        Get
            Return _Title
        End Get
    End Property

End Class

Az alábbi kód a konstruktor argumentumainak átváltásával kijavítja az előző szabálysértést.

public class Book
{
    public Book(string title)
    {
        Title = title ??
            throw new ArgumentNullException(nameof(title), "All books must have a title.");
    }

    public string Title { get; }
}
Public Class Book

    Private ReadOnly _Title As String

    Public Sub New(ByVal title As String)
        If (title Is Nothing) Then
            Throw New ArgumentNullException("title", "title cannot be a null reference (Nothing in Visual Basic)")
        End If

        _Title = title
    End Sub

    Public ReadOnly Property Title()
        Get
            Return _Title
        End Get
    End Property

End Class