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


CA1062: Nyilvános metódusok argumentumainak ellenőrzése

Tulajdonság Érték
Szabályazonosító CA1062
Cím Nyilvános metódusok argumentumainak érvényesítése
Kategória Tervez
A javítás kompatibilitástörő vagy nem törik Nem törés
Alapértelmezés szerint engedélyezve a .NET 9-ben Nem

Ok

A külsőleg látható metódusok nem ellenőrzik, hogy az argumentum (nulla Visual Basicben) szerepel-e Nothing .

Ezt a szabályt úgy konfigurálhatja, hogy bizonyos típusokat és paramétereket kizárjon az elemzésből. A null-ellenőrző érvényesítési módszereket is megjelölheti.

Szabály leírása

A külsőleg látható metódusoknak átadott összes hivatkozási argumentumot nullellenőrizni kell. Ha szükséges, dobjon egy ArgumentNullException értéket, ha az argumentum értéke .null

Ha egy metódus meghívható egy ismeretlen szerelvényből, mert nyilvánosnak vagy védettnek nyilvánították, ellenőrizze a metódus összes paraméterét. Ha a metódust úgy tervezték, hogy csak ismert szerelvények hívják meg, jelölje meg a metódust internal , és alkalmazza az InternalsVisibleToAttribute attribútumot a metódust tartalmazó szerelvényre.

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

A szabály megsértésének kijavításához ellenőrizze az egyes hivatkozási argumentumokat null.

Mikor kell letiltani a figyelmeztetéseket?

A szabály figyelmeztetését letilthatja, ha biztos abban, hogy a dereferenced paramétert a függvény egy másik metódushívása érvényesítette.

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

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.CA1062.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ások segítségével konfigurálhatja, hogy a kódbázis mely részein futtassa ezt a szabályt.

Emellett a következő, adatfolyam-elemzéssel kapcsolatos lehetőségek is érvényesek erre a szabályra:

Ezek a beállítások konfigurálhatók csak erre a szabályra, az összes szabályra, vagy az ebben a kategóriában szereplő összes szabályra (Tervezési), amelyekre vonatkoznak. További információ: Kódminőségi szabály konfigurációs beállításai.

Adott API-felületek belefoglalása

A api_surface beállítással konfigurálhatja, hogy a kódbázis mely részein futtassa 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

Feljegyzés

Cserélje le a XXXXCAXXXX részét a vonatkozó szabály azonosítójára.

Feljegyzés

Ez a beállítás csak a .NET 7-es és újabb verzióiban támogatott CA1062 esetén.

Adott szimbólumok kizárása

A excluded_symbol_names beállítással kizárhat bizonyos szimbólumokat, például típusokat és metódusokat az elemzésből. Ha például meg szeretné adni, hogy a szabály ne fusson a nevesített MyTypetípusok egyikén sem, adja hozzá a következő kulcs-érték párot a projekt egyik .editorconfig fájljához:

dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType

Feljegyzés

Cserélje le a XXXXCAXXXX részét a vonatkozó szabály azonosítójára.

Engedélyezett szimbólumnévformátumok a beállításértékben (a következővel |elválasztva):

  • Csak szimbólumnév (a névvel ellátott összes szimbólumot tartalmazza, függetlenül attól, hogy milyen típusú vagy névtérrel rendelkezik).
  • A szimbólum dokumentációazonosító-formátumában szereplő teljes nevek. Minden szimbólumnévhez szimbólum típusú előtag szükséges, például M: metódusokhoz, T: típusokhoz és N: névterekhez.
  • .ctor konstruktorok és .cctor statikus konstruktorok számára.

Példák:

Beállítás értéke Összegzés
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType Megegyezik az összes elnevezett MyTypeszimbólummal.
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 Megegyezik az összes elnevezett MyType1 szimbólummal vagy MyType2.
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) Megfelel a megadott metódusnak MyMethod a megadott teljes jogosultsággal rendelkező aláírással.
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) Egyezik az adott metódusokkal MyMethod1 és MyMethod2 a megfelelő, teljes mértékben minősített aláírásokkal.

Adott típusok és származtatott típusok kizárása

A excluded_type_names_with_derived_types beállítás beállításával kizárhat bizonyos típusokat és azok származtatott típusait az elemzésből. Ha például meg szeretné adni, hogy a szabály ne fusson a nevesített MyType és származtatott típusok egyik metódusán sem, adja hozzá a következő kulcs-érték párot a projekt egyik .editorconfig fájljához:

dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType

Feljegyzés

Cserélje le a XXXXCAXXXX részét a vonatkozó szabály azonosítójára.

Engedélyezett szimbólumnévformátumok a beállításértékben (a következővel |elválasztva):

  • Csak típusnév (a névvel rendelkező összes típust tartalmazza, függetlenül attól, hogy milyen típust vagy névteret tartalmaz).
  • A szimbólum dokumentációazonosító-formátumában szereplő teljes nevek opcionális T: előtaggal.

Példák:

Beállítás értéke Összegzés
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType Megfelel az összes névvel ellátott MyType típusnak és az összes származtatott típusnak.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 Megfelel az összes névvel ellátott MyType1 típusnak, vagy MyType2 az összes származtatott típusnak.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType Egyezik MyType a megadott teljes névvel és az összes származtatott típusával.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 Egyezik az adott típusokkal MyType1 és MyType2 a megfelelő teljes névvel, valamint az összes származtatott típussal.

Az "ez" paraméter bővítménymetódus kizárása

Ez a szabály alapértelmezés szerint elemzi és megjelöli a this bővítménymetelyek paraméterét. Kizárhatja a this bővítménymetelyek paraméterének elemzését, ha hozzáadja a következő kulcs-érték párot egy .editorconfig fájlhoz a projektben:

dotnet_code_quality.CA1062.exclude_extension_method_this_parameter = true

Null ellenőrzési ellenőrzési módszerek

Ez a szabály hamis pozitív eredményhez vezethet, ha a kód speciális null-ellenőrzési ellenőrzési módszereket hív meg a hivatkozott kódtárakban vagy projektekben. Ezeket a hamis pozitív értékeket elkerülheti a null-ellenőrző érvényesítési módszerek nevének vagy aláírásának megadásával. Az elemzés feltételezi, hogy a metódusoknak átadott argumentumok nem null értékűek a hívás után. Ha például az összes metódust Validate null-ellenőrző érvényesítési metódusként szeretné megjelölni, adja hozzá a következő kulcs-érték párot a projekt egyik .editorconfig fájljához:

dotnet_code_quality.CA1062.null_check_validation_methods = Validate

Engedélyezett metódusnévformátumok a beállításértékben (a következővel |elválasztva):

  • Csak a metódus neve (a névvel rendelkező összes metódust tartalmazza, függetlenül a nevet tartalmazó típustól vagy névtértől).
  • A szimbólum dokumentációazonosító-formátumában szereplő teljes nevek opcionális M: előtaggal.

Példák:

Beállítás értéke Összegzés
dotnet_code_quality.CA1062.null_check_validation_methods = Validate Megfelel a fordításban elnevezett Validate összes metódusnak.
dotnet_code_quality.CA1062.null_check_validation_methods = Validate1|Validate2 Megfelel a fordításban vagy Validate1 a Validate2 fordításban szereplő összes metódusnak.
dotnet_code_quality.CA1062.null_check_validation_methods = NS.MyType.Validate(ParamType) Megfelel a megadott metódusnak Validate a megadott teljes aláírással.
dotnet_code_quality.CA1062.null_check_validation_methods = NS1.MyType1.Validate1(ParamType)|NS2.MyType2.Validate2(ParamType) Egyezik a megadott metódusokkal Validate1 és Validate2 a megfelelő teljes aláírással.

1. példa

Az alábbi példa egy olyan metódust mutat be, amely megsérti a szabályt, és egy olyan metódust, amely megfelel a szabálynak.

using System;

namespace DesignLibrary
{
    public class Test
    {
        // This method violates the rule.
        public void DoNotValidate(string input)
        {
            if (input.Length != 0)
            {
                Console.WriteLine(input);
            }
        }

        // This method satisfies the rule.
        public void Validate(string input)
        {
            if (input == null)
            {
                throw new ArgumentNullException(nameof(input));
            }
            if (input.Length != 0)
            {
                Console.WriteLine(input);
            }
        }
    }
}
Imports System

Namespace DesignLibrary

    Public Class Test

        ' This method violates the rule.
        Sub DoNotValidate(ByVal input As String)

            If input.Length <> 0 Then
                Console.WriteLine(input)
            End If

        End Sub

        ' This method satisfies the rule.
        Sub Validate(ByVal input As String)

            If input Is Nothing Then
                Throw New ArgumentNullException(NameOf(input))
            End If

            If input.Length <> 0 Then
                Console.WriteLine(input)
            End If

        End Sub

    End Class

End Namespace

2. példa

A referenciaobjektumokat tartalmazó mezőket vagy tulajdonságokat felépítő konstruktorok másolása a CA1062 szabályt is sértheti. A szabálysértés azért fordul elő, mert a másolási konstruktornak átadott másolt objektum lehet null (Nothing a Visual Basicben). A szabálysértés elhárításához használjon (staticSharedVisual Basic) metódust annak ellenőrzéséhez, hogy a másolt objektum nem null értékű-e.

Az alábbi Person osztály példában a other másolási konstruktornak átadott objektum lehetPerson.null

public class Person
{
    public string Name { get; private set; }
    public int Age { get; private set; }

    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }

    // Copy constructor CA1062 fires because other is dereferenced
    // without being checked for null
    public Person(Person other)
        : this(other.Name, other.Age)
    {
    }
}

3. példa

A következő módosított Person példában a other másolási konstruktornak átadott objektum először null értékre van bejelölve a PassThroughNonNull metódusban.

public class Person
{
    public string Name { get; private set; }
    public int Age { get; private set; }

    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }

    // Copy constructor
    public Person(Person other)
        : this(PassThroughNonNull(other).Name, other.Age)
    {
    }

    // Null check method
    private static Person PassThroughNonNull(Person person)
    {
        if (person == null)
            throw new ArgumentNullException(nameof(person));
        return person;
    }
}