CA1062: Genel yöntemlerin bağımsız değişkenlerini doğrulayın
Özellik | Değer |
---|---|
Kural Kimliği | CA1062 |
Başlık | Genel metotların bağımsız değişkenlerini doğrulayın |
Kategori | Tasarım |
Hataya neden olan veya bozulmayan düzeltme | Hataya neden olmayan |
.NET 8'de varsayılan olarak etkin | Hayır |
Neden
Dışarıdan görünür bir yöntem, bu bağımsız değişkenin (Nothing
Visual Basic'te) olup olmadığını doğrulamadan başvuru bağımsız değişkenlerinden null
birini başvurudan çıkartır.
Bu kuralı, belirli türleri ve parametreleri analizden dışlamak için yapılandırabilirsiniz. Null denetimi doğrulama yöntemlerini de belirtebilirsiniz.
Kural açıklaması
Dışarıdan görünen yöntemlere geçirilen tüm başvuru bağımsız değişkenleri ile denetlenmelidir null
. Uygunsa, bağımsız değişken olduğunda null
bir ArgumentNullException at.
Bir yöntem genel veya korumalı olarak bildirildiği için bilinmeyen bir derlemeden çağrılabiliyorsa, yöntemin tüm parametrelerini doğrulamanız gerekir. yöntemi yalnızca bilinen derlemeler tarafından çağrılacak şekilde tasarlanmışsa, yöntemini işaretleyin ve yöntemini internal
içeren derlemeye özniteliğini uygulayın InternalsVisibleToAttribute .
İhlalleri düzeltme
Bu kuralın ihlalini düzeltmek için her başvuru bağımsız değişkenini ile null
doğrulayın.
Uyarıların ne zaman bastırılması gerekiyor?
Başvurulmayan parametrenin işlevdeki başka bir yöntem çağrısı tarafından doğrulandığından eminseniz, bu kuraldan gelen bir uyarıyı gizleyebilirsiniz.
Uyarıyı gizleme
Yalnızca tek bir ihlali engellemek istiyorsanız, kuralı devre dışı bırakmak ve sonra yeniden etkinleştirmek için kaynak dosyanıza ön işlemci yönergeleri ekleyin.
#pragma warning disable CA1062
// The code that's violating the rule is on this line.
#pragma warning restore CA1062
Bir dosya, klasör veya projenin kuralını devre dışı bırakmak için, yapılandırma dosyasındaki önem derecesini none
olarak ayarlayın.
[*.{cs,vb}]
dotnet_diagnostic.CA1062.severity = none
Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.
Çözümlemek için kod yapılandırma
Bu kuralın kod tabanınızın hangi bölümlerinde çalıştırılacaklarını yapılandırmak için aşağıdaki seçenekleri kullanın.
- Belirli API yüzeylerini ekleme
- Belirli simgeleri hariç tutma
- Belirli türleri ve türetilmiş türlerini dışlama
- Uzantı yöntemi 'this' parametresini dışla
- Null denetim doğrulama yöntemleri
Bu seçenekler yalnızca bu kural, geçerli olduğu tüm kurallar veya bu kategorideki (Tasarım) tüm kurallar için yapılandırılabilir. Daha fazla bilgi için bkz . Kod kalitesi kuralı yapılandırma seçenekleri.
Belirli API yüzeylerini ekleme
Bu kuralın üzerinde çalıştırılacak kod tabanınızın hangi bölümlerini erişilebilirliklerine göre yapılandırabilirsiniz. Örneğin, kuralın yalnızca genel olmayan API yüzeyinde çalıştırılması gerektiğini belirtmek için projenizdeki bir .editorconfig dosyasına aşağıdaki anahtar-değer çiftini ekleyin:
dotnet_code_quality.CAXXXX.api_surface = private, internal
Not
Bu seçenek yalnızca .NET 7 ve sonraki sürümlerde CA1062 için desteklenir.
Belirli simgeleri hariç tutma
Türler ve yöntemler gibi belirli simgeleri analizden hariç tutabilirsiniz. Örneğin, kuralın adlı MyType
türlerdeki herhangi bir kodda çalışmaması gerektiğini belirtmek için, projenizdeki bir .editorconfig dosyasına aşağıdaki anahtar-değer çiftini ekleyin:
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType
Seçenek değerinde izin verilen simge adı biçimleri (ile |
ayrılmış):
- Yalnızca sembol adı (içeren tür veya ad alanı ne olursa olsun, ada sahip tüm simgeleri içerir).
- Simgenin belge kimliği biçimindeki tam adlar. Her simge adı için yöntemler
T:
, türler veN:
ad alanları gibiM:
bir sembol türü ön eki gerekir. .ctor
oluşturucular ve.cctor
statik oluşturucular için.
Örnekler:
Seçenek Değeri | Özet |
---|---|
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType |
adlı MyType tüm simgelerle eşleşir. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 |
veya MyType2 adlı MyType1 tüm simgelerle eşleşir. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) |
Belirtilen tam imza ile belirli bir yöntemi MyMethod eşleştirir. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) |
Belirli yöntemlerle MyMethod1 ve MyMethod2 ilgili tam imzalarla eşleşir. |
Belirli türleri ve türetilmiş türlerini dışlama
Belirli türleri ve türetilmiş türlerini analizden dışlayabilirsiniz. Örneğin, kuralın adlı MyType
ve türetilmiş türleri içindeki hiçbir yöntemde çalışmaması gerektiğini belirtmek için, projenizdeki bir .editorconfig dosyasına aşağıdaki anahtar-değer çiftini ekleyin:
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType
Seçenek değerinde izin verilen simge adı biçimleri (ile |
ayrılmış):
- Yalnızca tür adı (içeren tür veya ad alanına bakılmaksızın adı olan tüm türleri içerir).
- Simgenin belge kimliği biçiminde, isteğe bağlı
T:
ön ek içeren tam adlar.
Örnekler:
Seçenek Değeri | Özet |
---|---|
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType |
Adlı MyType tüm türleri ve türetilmiş türlerinin tümünü eşleştirir. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 |
veya MyType2 adlı MyType1 tüm türleri ve türetilmiş türlerinin tümünü eşleştirir. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType |
Belirli bir türü MyType verilen tam adla ve türetilmiş tüm türleriyle eşleştirir. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 |
Belirli türleri MyType1 ve MyType2 ilgili tam adlarla ve bunların türetilmiş tüm türleriyle eşleşir. |
Uzantı yöntemi 'this' parametresini dışla
Varsayılan olarak, bu kural uzantı yöntemleri için parametresini this
analiz eder ve bayraklar. Projenizdeki bir .editorconfig dosyasına aşağıdaki anahtar-değer çiftini ekleyerek uzantı yöntemleri için parametresinin analizini this
dışlayabilirsiniz:
dotnet_code_quality.CA1062.exclude_extension_method_this_parameter = true
Null denetim doğrulama yöntemleri
Bu kural, kodunuz başvuruda bulunılan kitaplıklarda veya projelerde özel null-check doğrulama yöntemlerini çağırırsa hatalı pozitiflere yol açabilir. Null denetim doğrulama yöntemlerinin adını veya imzasını belirterek bu hatalı pozitif sonuçları önleyebilirsiniz. Çözümleme, bu yöntemlere geçirilen bağımsız değişkenlerin çağrıdan sonra null olmadığını varsayar. Örneğin, null-check doğrulama yöntemleri olarak adlandırılan Validate
tüm yöntemleri işaretlemek için projenizdeki bir .editorconfig dosyasına aşağıdaki anahtar-değer çiftini ekleyin:
dotnet_code_quality.CA1062.null_check_validation_methods = Validate
Seçenek değerinde izin verilen yöntem adı biçimleri (ile |
ayrılmış):
- Yalnızca yöntem adı (içeren tür veya ad alanı ne olursa olsun, ada sahip tüm yöntemleri içerir).
- Simgenin belge kimliği biçiminde, isteğe bağlı
M:
ön ek içeren tam adlar.
Örnekler:
Seçenek Değeri | Özet |
---|---|
dotnet_code_quality.CA1062.null_check_validation_methods = Validate |
Derlemede adlı Validate tüm yöntemlerle eşleşir. |
dotnet_code_quality.CA1062.null_check_validation_methods = Validate1|Validate2 |
Derlemede veya Validate2 adlı Validate1 tüm yöntemlerle eşleşir. |
dotnet_code_quality.CA1062.null_check_validation_methods = NS.MyType.Validate(ParamType) |
Belirli bir yöntemi Validate verilen tam imzayla eşleştirir. |
dotnet_code_quality.CA1062.null_check_validation_methods = NS1.MyType1.Validate1(ParamType)|NS2.MyType2.Validate2(ParamType) |
Belirli yöntemlerle Validate1 ve Validate2 ilgili tam imzayla eşleşir. |
Örnek 1
Aşağıdaki örnekte kuralı ihlal eden bir yöntem ve kuralı karşılayan bir yöntem gösterilmektedir.
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
Örnek 2
Başvuru nesneleri olan alanları veya özellikleri dolduran kopya oluşturucuları da CA1062 kuralını ihlal edebilir. Kopya oluşturucuya geçirilen kopyalanan nesne (Nothing
Visual Basic'te) olabileceğinden null
ihlal oluşur. İhlali çözmek için, kopyalanan nesnenin null olmadığını denetlemek için ( static
Shared
Visual Basic'te) yöntemini kullanın.
Aşağıdaki Person
sınıf örneğinde, other
kopya oluşturucusunun Person
geçirilen nesnesi olabilir 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)
{
}
}
Örnek 3
Aşağıdaki düzeltilmiş Person
örnekte, other
kopya oluşturucuya geçirilen nesne ilk olarak yönteminde PassThroughNonNull
null olarak denetlendi.
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;
}
}