CA1810: Başvuru türü statik alanları satır içi başlatın
Ö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 |
Hataya neden olan veya bozulmayan düzeltme | Hataya neden olmayan |
.NET 8'de varsayılan olarak etkin | Hayır |
Neden
Bir başvuru türü açık bir statik oluşturucu bildirir.
Kural açıklaması
Bir tür açık statik yapıcı bildirdiğinde, JIT derleyici her bir statik yöntemi kontrol ekler ve türün yapıcı örneği statik yapıcının daha önceden çağrıldığından emin olur. 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 bayrağıyla karşılaştığında beforefieldinit
, çoğu zaman statik oluşturucu 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:
Genel durum üzerindeki etkisi pahalıdır ve tür kullanılmadıysa gerekli değildir.
Genel durum etkilerine, türündeki statik alanlara erişmeden erişilebilir.
İhlalleri düzeltme
Bu kural ihlalini düzeltmek için bildirildiğinde, tüm statik veriyi başlatın ve statik oluşturucuyu 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 none
olarak 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, StaticConstructor
kuralı 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ü NoStaticConstructor
gösterilir.
public class StaticConstructor
{
static int someInteger;
static string? resourceString;
static StaticConstructor()
{
someInteger = 3;
ResourceManager stringManager =
new ResourceManager("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 ResourceManager("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
sınıfı için CIL tanımında bayrağının eklenmesine beforefieldinit
dikkat edin NoStaticConstructor
.
.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