CA1810: Zainicjuj wbudowane pola statyczne typu referencyjnego
TypeName |
InitializeReferenceTypeStaticFieldsInline |
CheckId |
CA1810 |
Kategoria |
Microsoft.Performance |
Złamanie zmiany |
Bez podziału |
Przyczyna
Typ odwołania deklaruje jawne konstruktorze statycznym.
Opis reguły
Kiedy typu deklaruje jawne konstruktorze statycznym, kompilatora (JIT) w czasie dodaje wyboru do każdego statycznej metody i wystąpienie konstruktora typu, aby upewnić się, że w konstruktorze statycznym była wcześniej nazywana.Inicjowanie statyczne zostanie wywołany podczas uzyskiwania dostępu do członka statycznego lub gdy tworzone jest wystąpienie tego typu.Jednakże Inicjowanie statyczne nie zostanie wywołany, jeśli zadeklarować zmienną typu, ale nie należy go używać, które mogą być istotne, jeśli Inicjalizacja zmienia stan globalny.
Podczas wszystkich danych statycznych jest wbudowany zainicjowany i jawne konstruktorze statycznym nie został zadeklarowany, dodać kompilatorów języka pośredniego (MSIL) firmy Microsoft beforefieldinit flagę i niejawne konstruktora statycznego, który inicjuje danych statycznych, aby MSIL wpisz definicję.Gdy napotka kompilator JIT beforefieldinit flagę, w większości przypadków, w konstruktorze statycznym kontroli nie są dodawane.Inicjowanie statyczne jest gwarantowane występują na pewien czas, przed uzyskaniem dostępu do żadnych statycznych pól, ale nie przed jest wywoływany w konstruktorze statycznym metody lub wystąpienia.Uwaga w tym statycznego zainicjowania może występować w dowolnym momencie po zadeklarowaniu zmiennej typu.
Kontrole w konstruktorze statycznym może obniżyć wydajność.Często konstruktora statycznego jest używana tylko do zainicjowania statyczne pola, w których przypadku tylko należy upewnić się że Inicjowanie statyczne występuje przed pierwszym dostępu pola statycznego.beforefieldinit Zachowanie jest odpowiednia dla tych i innych typów.Jest tylko niewłaściwe, gdy Inicjowanie statyczne ma wpływ na stan globalny i spełniony jest jeden z następujących czynności:
Wpływ na stan globalny jest kosztowne i nie jest wymagane, jeśli typ nie jest używany.
Efekty globalne Państwo jest możliwy bez uzyskiwania dostępu do żadnych statycznych pól typu.
Jak naprawić naruszenia
Aby naprawić naruszenie tej zasady, zainicjować wszystkich danych statycznych, gdy jest on zadeklarowany jako i usunąć w konstruktorze statycznym.
Kiedy do pomijania ostrzeżenia
Można bezpiecznie pominąć ostrzeżenie od tej reguły, jeśli wydajności nie jest przedmiotem szczególnej troski; lub jeśli zmian globalnych Państwa, które są powodowane przez Inicjowanie statyczne są drogie lub musi być zagwarantowana ma się pojawić przed nosi nazwę statycznej metody typu lub tworzone jest wystąpienie typu.
Przykład
W poniższym przykładzie pokazano typu, StaticConstructor, który narusza reguły i typ, NoStaticConstructor, która zamienia w konstruktorze statycznym Inicjalizacja wbudowanego do spełniają reguły.
Imports System
Imports System.Resources
Namespace PerformanceLibrary
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()
Shared Private Function InitializeResourceString()
Dim stringManager As New ResourceManager("strings", _
System.Reflection.Assembly.GetExecutingAssembly())
Return stringManager.GetString("string")
End Function
End Class
End Namespace
using System;
using System.Reflection;
using System.Resources;
namespace PerformanceLibrary
{
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 class NoStaticConstructor
{
static int someInteger = 3;
static string resourceString = InitializeResourceString();
static string InitializeResourceString()
{
ResourceManager stringManager =
new ResourceManager("strings", Assembly.GetExecutingAssembly());
return stringManager.GetString("string");
}
}
}
Uwaga dodanie beforefieldinit flagę Definicja MSIL dla NoStaticConstructor klasy.