Sdílet prostřednictvím


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.

  

Souvisejících pravidel

CA2207: Inicializujte vloženou hodnotu statických polí