Udostępnij za pośrednictwem


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.

  

Zasady pokrewne

CA2207: Inicjowanie pól statycznych typu wartościowego