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 | CA1810 |
| Başlık | Başvuru türü statik alanları satır içinden başlatın |
| Kategori | Performans |
| 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 başvuru türü açık bir statik oluşturucu bildirir.
Kural açıklaması
Bir tür açık bir statik yapıcı bildirdiğinde, JIT derleyici, statik yapıcının daha önce çağrıldığından emin olmak için türün her bir statik yöntemi ve örnek yapıcısına bir kontrol ekler. Statik başlatma, herhangi bir statik üyeye erişildiğinde veya türün bir örneği oluşturulduğunda tetiklenir. Ancak, türün bir değişkenini bildirirseniz ancak bunu kullanmazsanız statik başlatma tetiklenmez. Bu, başlatmanın genel durumunu değiştirmesi durumunda önemli olabilir.
Tüm statik veriler satır içinde başlatıldığında ve açık bir statik oluşturucu bildirilmezse, ortak ara dil (CIL) derleyicileri bayrağını beforefieldinit ve statik verileri başlatan örtük bir statik oluşturucuyu CIL tür tanımına ekler. JIT derleyicisi beforefieldinit bayrağıyla karşılaştığında, genellikle statik yapıcı denetimleri eklenmez. Statik başlatmanın, statik alanlara erişilmeden önce ancak statik bir yöntem veya örnek oluşturucu çağrılmadan önce gerçekleşmesi garanti edilir. Statik başlatmanın türündeki bir değişken bildirildikten sonra herhangi bir zamanda gerçekleşebileceğini unutmayın.
Statik oluşturucu denetimleri performansı düşürebilir. Genellikle statik oluşturucu yalnızca statik alanları başlatmak için kullanılır; bu durumda statik bir alana ilk erişimden önce yalnızca statik başlatmanın gerçekleştiğinden emin olmanız gerekir. Davranış beforefieldinit , bunlar ve diğer türlerin çoğu için uygundur. Yalnızca statik başlatma genel durumu etkilediğinde ve aşağıdakilerden biri doğru olduğunda uygun değildir:
Tür kullanılmadıysa küresel durum üzerindeki etkisi pahalıdır ve gerekli değildir.
Türün statik alanlarına erişmeye gerek kalmadan genel durum etkilerine erişilebilir.
İhlalleri düzeltme
Bu kural ihlalini düzeltmek için deklare edildiğinde tüm statik verileri başlatın ve statik kurucuyu kaldırın.
Uyarıların ne zaman bastırılması gerekiyor?
Aşağıdakilerden biri geçerliyse, bu kuraldan bir uyarıyı engellemek güvenlidir:
- Performans önemli değildir.
- Statik başlatmanın neden olduğu genel durum değişiklikleri pahalıdır veya türün statik bir yöntemi çağrılmadan veya türün bir örneği oluşturulmadan önce gerçekleşmesi garanti edilmelidir.
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 CA1810
// The code that's violating the rule is on this line.
#pragma warning restore CA1810
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.CA1810.severity = none
Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.
Örnek
Aşağıdaki örnekte, StaticConstructorkuralı ihlal eden bir türü ve kuralı karşılamak için statik oluşturucuyu satır içi başlatma ile değiştiren bir türü NoStaticConstructorgösterilir.
public class StaticConstructor
{
static int someInteger;
static string? resourceString;
static StaticConstructor()
{
someInteger = 3;
ResourceManager stringManager =
new("strings", Assembly.GetExecutingAssembly());
resourceString = stringManager.GetString("string");
}
public void Print()
{
Console.WriteLine(someInteger);
}
}
public class NoStaticConstructor
{
static int someInteger = 3;
static string? resourceString = InitializeResourceString();
static string? InitializeResourceString()
{
ResourceManager stringManager =
new("strings", Assembly.GetExecutingAssembly());
return stringManager.GetString("string");
}
public void Print()
{
Console.WriteLine(someInteger);
}
}
Imports System
Imports System.Resources
Namespace ca1810
Public Class StaticConstructor
Shared someInteger As Integer
Shared resourceString As String
Shared Sub New()
someInteger = 3
Dim stringManager As New ResourceManager("strings",
System.Reflection.Assembly.GetExecutingAssembly())
resourceString = stringManager.GetString("string")
End Sub
End Class
Public Class NoStaticConstructor
Shared someInteger As Integer = 3
Shared resourceString As String = InitializeResourceString()
Private Shared Function InitializeResourceString()
Dim stringManager As New ResourceManager("strings",
System.Reflection.Assembly.GetExecutingAssembly())
Return stringManager.GetString("string")
End Function
End Class
End Namespace
beforefieldinit bayrağının NoStaticConstructor sınıfı için CIL tanımına eklenmesine dikkat edin.
.class public auto ansi StaticConstructor
extends [mscorlib]System.Object
{
} // end of class StaticConstructor
.class public auto ansi beforefieldinit NoStaticConstructor
extends [mscorlib]System.Object
{
} // end of class NoStaticConstructor