Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
| Özellik | Değer |
|---|---|
| Kural Kimliği | CA1062 |
| Başlık | Genel yöntemlerin parametrelerini doğrulayın |
| Kategori | Tasarım |
| Düzeltme bozucu ya da bozmayan olabilir | Kesintisiz |
| .NET 10'da varsayılan olarak etkin | Hayır |
| Geçerli diller | C# ve Visual Basic |
Neden
Bir metot, dışarıdan görülebilir olduğunda, bu bağımsız değişkenin null (Nothing Visual Basic'te) olup olmadığını doğrulamadan, referans bağımsız değişkenlerinden birini bağlamından çı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 null karşı denetlenmelidir. Uygunsa, argüman null olduğunda bir ArgumentNullException atın.
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. Eğer yöntem yalnızca bilinen derlemeler tarafından çağrılmak üzere tasarlandıysa, yöntemi internal olarak işaretleyin ve yöntemi içeren derlemeye InternalsVisibleToAttribute özniteliğini uygulayın.
İhlalleri düzeltme
Bu kuralın ihlalini düzeltmek için her başvuru bağımsız değişkenini null'e karşı doğrulayın.
Uyarıların ne zaman bastırılması gerekiyor?
Dereference edilen 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 noneolarak ayarlayın.
[*.{cs,vb}]
dotnet_diagnostic.CA1062.severity = none
Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.
Kod çözümleme için konfigüre et
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 kontrol ve doğrulama yöntemleri
Ayrıca, bu kural için aşağıdaki diğer veri akışı analiziyle ilgili seçenekler geçerlidir:
- interprocedural_analysis_kind
- max_interprocedural_lambda_or_local_function_call_chain
- max_interprocedural_method_call_chain
- points_to_analysis_kind
- copy_analysis
- zayıf KDF algoritması için yeterli İterasyon Sayısı
Bu seçenekler yalnızca bu kural için, uyguladıkları tüm kurallar için veya bu kategorideki (Tasarım) geçerli oldukları 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
api_surface seçeneğini ayarlayarak, bu kuralın erişilebilirliği temelinde kod tabanınızın hangi bölümlerinde çalıştırılacaklarını 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
XXXX
CAXXXX bölümünü geçerli kuralın kimliğiyle değiştirin.
Not
Bu seçenek yalnızca .NET 7 ve sonraki sürümlerde CA1062 için desteklenir.
Belirli simgeleri hariç tutma
excluded_symbol_names seçeneğini ayarlayarak türler ve yöntemler gibi belirli simgeleri analizden hariç tutabilirsiniz. Örneğin, kuralın adlı MyTypetü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
Not
XXXX
CAXXXX bölümünü geçerli kuralın kimliğiyle değiştirin.
Seçenek değerinde izin verilen simge adı biçimleri (ile |ayrılmış):
- Yalnızca sembol adı (içerildiği tür veya ad alanından bağımsız olarak ada sahip tüm simgeleri içerir).
- Simgelerin dökümantasyon kimliği formatındaki tam adlar. Her sembol adı için, yöntemler için
M:, türler içinT:, ve ad alanları içinN:gibi bir sembol türü ön eki gerekir. -
.ctoroluşturucular ve.cctorstatik oluşturucular için.
Örnekler:
| Seçenek Değeri | Özet |
|---|---|
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType |
adlı MyTypetüm simgelerle eşleşir. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 |
MyType1 veya MyType2 adlı 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
excluded_type_names_with_derived_types seçeneğini ayarlayarak 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
Not
XXXX
CAXXXX bölümünü geçerli kuralın kimliğiyle değiştirin.
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 |
Adı MyType olan tüm türleri ve türevlerini eşleştirir. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 |
MyType1 veya MyType2 adlı tüm türleri ve bunların türetilmiş türlerinin tamamı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ürler MyType1 ve MyType2 ile bunların türetilmiş tüm türleri, ilgili tam adlarla eşleşir. |
Uzantı yöntemi 'this' parametresini dışla
Varsayılan olarak, bu kural, uzantı yöntemleri için this parametresini analiz eder ve işaretler. Projenizdeki bir .editorconfig dosyasına aşağıdaki anahtar-değer çiftini ekleyerek uzantı yöntemleri için this analizini dışı bırakabilirsiniz.
dotnet_code_quality.CA1062.exclude_extension_method_this_parameter = true
Null kontrol geçerlilik 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. Analiz, bu yöntemlere geçirilen bağımsız değişkenlerin çağrı sonrasında null olmaması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ı (tür veya ad alanı ne olursa olsun, adı geçen 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 Validate adlı tüm yöntemleri eşleştirir. |
dotnet_code_quality.CA1062.null_check_validation_methods = Validate1|Validate2 |
Derlemede Validate1 veya Validate2 olarak adlandırılan tüm yöntemlerle eşleşir. |
dotnet_code_quality.CA1062.null_check_validation_methods = NS.MyType.Validate(ParamType) |
Belirli bir metodu Validate verilen tam nitelikli imzayla eşleştirir. |
dotnet_code_quality.CA1062.null_check_validation_methods = NS1.MyType1.Validate1(ParamType)|NS2.MyType2.Validate2(ParamType) |
Belirli yöntemler Validate1 ve Validate2 ile, ilgili tam nitelikli imzalarla 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 null (Nothing Visual Basic'te) olabileceğinden ihlal oluşur. İhlali çözmek için, kopyalanan nesnenin null olmadığını denetlemek için ( staticShared Visual Basic'te) yöntemini kullanın.
Aşağıdaki Person sınıf örneğinde, kopya yapıcıya (Person) geçirilen other nesnesi null olabilir.
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 önce PassThroughNonNull yönteminde null olarak denetlenir.
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;
}
}