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 | Design |
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 | Nem |
Ok
A külsőleg látható metódusok nem ellenőrzik, hogy az argumentum (Nothing
a Visual Basicben) szerepel-e null
.
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 null
ellenő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.
- Adott API-felületek belefoglalása
- Adott szimbólumok kizárása
- Adott típusok és származtatott típusok kizárása
- Az "ez" paraméter bővítménymetódus kizárása
- Null ellenőrzési ellenőrzési módszerek
Ezek a beállítások konfigurálhatók 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
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
Bizonyos szimbólumokat, például típusokat és metódusokat kizárhat az elemzésből. Ha például meg szeretné adni, hogy a szabály ne fusson a nevesített MyType
tí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
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 ésN:
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 MyType szimbó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
Bizonyos típusokat és azok származtatott típusait kizárhatja 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
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 Validate2 a Validate1 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 (static
Shared
Visual 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 lehetnull
.Person
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;
}
}