CA2211: Sabit olmayan alanlar görünür olmamalıdır
Özellik | Değer |
---|---|
Kural Kimliği | CA2211 |
Başlık | Sabit olmayan alanlar görünür olmamalıdır |
Kategori | Kullanım |
Hataya neden olan veya bozulmayan düzeltme | Yeni |
.NET 9'da varsayılan olarak etkin | Öneri olarak |
Neden
Genel veya korumalı statik alan sabit değildir ve salt okunur değildir.
Kural açıklaması
Ne sabitler, ne de salt okunur olan statik alanlar güvenli iş parçacığı değildir. Böyle bir alana erişim dikkatle denetlenmelidir ve sınıf nesnesine erişimi eşitlemek için gelişmiş programlama teknikleri gerektirir. Bunlar öğrenmesi zor beceriler olduğundan ve bu tür bir nesneyi test etmek kendi zorluklarını oluşturduğundan, statik alanlar değişmeyen verileri depolamak için en iyi şekilde kullanılır. Bu kural kitaplıklar için geçerlidir; uygulamalar hiçbir alanı kullanıma sunmamalıdır.
İhlalleri düzeltme
Bu kuralın ihlalini düzeltmek için statik alanı sabit veya salt okunur yapın. Bu mümkün değilse, türü, temel alan için iş parçacığı güvenli erişimi yöneten iş parçacığı güvenli özelliği gibi alternatif bir mekanizma kullanacak şekilde yeniden tasarlayın. Kilit çekişmesi ve kilitlenmeler gibi sorunların kitaplığın performansını ve davranışını etkileyebileceğini fark edin.
Uyarıların ne zaman bastırılması gerekiyor?
Bir uygulama geliştiriyorsanız ve bu nedenle statik alanı içeren türe erişim üzerinde tam denetime sahipseniz, bu kuraldan gelen bir uyarıyı gizlemeniz güvenlidir. Kitaplık tasarımcıları bu kuraldan gelen bir uyarıyı gizlememelidir; sabit olmayan statik alanların kullanılması, kitaplığın geliştiricilerin doğru şekilde kullanılmasını zorlaştırabilir.
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 CA2211
// The code that's violating the rule is on this line.
#pragma warning restore CA2211
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.CA2211.severity = none
Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.
Örnek
Aşağıdaki örnekte bu kuralı ihlal eden bir tür gösterilmektedir.
Imports System
Namespace ca2211
Public Class SomeStaticFields
' Violates rule: AvoidNonConstantStatic;
' the field is public and not a literal.
Public Shared publicField As DateTime = DateTime.Now
' Satisfies rule: AvoidNonConstantStatic.
Public Shared ReadOnly literalField As DateTime = DateTime.Now
' Satisfies rule: NonConstantFieldsShouldNotBeVisible;
' the field is private.
Private Shared privateField As DateTime = DateTime.Now
End Class
End Namespace
public class SomeStaticFields
{
// Violates rule: AvoidNonConstantStatic;
// the field is public and not a literal.
static public DateTime publicField = DateTime.Now;
// Satisfies rule: AvoidNonConstantStatic.
public static readonly DateTime literalField = DateTime.Now;
// Satisfies rule: NonConstantFieldsShouldNotBeVisible;
// the field is private.
static DateTime privateField = DateTime.Now;
}