CA1810: Inicializujte odkazový typ statického pole vloženě
Název_typu |
InitializeReferenceTypeStaticFieldsInline |
CheckId |
CA1810 |
Kategorie |
Microsoft.Performance |
Změnit rozdělení |
Bez rozdělení |
Příčina
Typ odkazu prohlašuje explicitní statický konstruktor.
Popis pravidla
Při typ deklaruje explicitní statický konstruktor, kompilátor just-in-time (JIT) přidá kontrolu každé statické metody a instance konstruktor typu zda, dříve nazývaný statický konstruktor.Inicializace statické je spuštěna při přístupu k statický člen nebo při vytváření instance typu.Inicializace statické však není spuštěna, pokud deklarujete proměnnou typu ale nepoužívejte, což může být důležité změně globální stav inicializace.
Při všech statických dat je inicializována vložené a explicitní statický konstruktor není deklarován, kompilátory zprostředkující jazyk (MSIL) Microsoft přidat beforefieldinit vlajky a implicitní statický konstruktor, který inicializuje statická data MSIL zadejte definici.Když kompilátor JIT narazí beforefieldinit příznak ve většině případů nejsou přidány kontroly statický konstruktor.Inicializace statické je zaručeno dochází v době před statické pole jsou přístupné, ale není před je vyvolána metoda nebo instance statického konstruktoru.Poznámka: Tento inicializace statické může dojít kdykoli po je deklarována proměnná typu.
Statický konstruktor kontroly může snížit výkon.Statický konstruktor je často používán pouze inicializovat statické pole, v nichž dojde k případu je nutné pouze zajistit tuto statickou inicializaci před prvním přístupu statické pole.beforefieldinit Je vhodné pro tyto a většinu typů chování.Je pouze nevhodné při statických inicializací ovlivňuje globální státu a je splněna jedna z následujících:
Vliv na globální stav je nákladné a není vyžadováno, pokud není použit typ.
Stát globální efekty lze přistupovat bez přístupu k žádné statické pole typu.
Jak opravit porušení
Porušení tohoto pravidla, inicializovat všechny statická data, když je deklarována a odebrat statický konstruktor.
Při potlačení upozornění
Je bezpečné potlačí upozornění od tohoto pravidla, pokud výkon se netýká; nebo pokud jsou drahé stát globální změny, které jsou způsobeny inicializace statické, nebo musí být zaručena dochází před statická metoda typu nebo vytvořena instance typu.
Příklad
Následující příklad ukazuje typ, StaticConstructor, který porušuje pravidla a typ, NoStaticConstructor, inicializace vložené splňovat pravidla, nahradí statický konstruktor.
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");
}
}
}
Poznámka: přídavek beforefieldinit vlajky na definici MSIL NoStaticConstructor třídy.