Compartilhar via


Inicializar in-line campos estático de tipo de referência

TypeName

InitializeReferenceTypeStaticFieldsInline

CheckId

CA1810

Category (Categoria)

Microsoft.desempenho

Quebrando alterar

Não separável

Causa

Um tipo de referência declara um construtor estático explícito.

Descrição da regra

Quando um tipo declara um construtor estático explícito, o compilador (JIT) just-in-time adiciona uma verificação a cada um dos métodos estáticos e construtores de instância para garantir que o construtor estático era anteriormente chamado do tipo de.Inicialização estática é disparada quando qualquer membro estático é acessado ou quando uma instância do tipo é criada.No entanto, estático inicialização não é disparada se você declara uma variável do tipo, mas não use, que pode ser importante se a inicialização altera o estado global.

Quando todos os dados estáticos é inicializado embutido e não está declarado como um construtor estático explícito, a Microsoft intermediate linguagem (MSIL) compiladores adicionar o beforefieldinit sinalizar e um construtor estático implícito, que inicializa dados estáticos, para o MSIL digite definição. Quando o compilador JIT encontra o beforefieldinit sinalizar, na maioria dos casos, que verifica o construtor estático não são adicionados. Inicialização estática é garantida para ocorrer em algum time antes de qualquer um dos campos estáticos são acessados, mas não antes de um método estático ou uma instância de construtor é chamado.Observe que estático inicialização possa ocorrer a qualquer momento após uma variável do tipo é declarado.

Verificações de construtor estático podem reduzir o desempenho.Geralmente, um construtor estático é usado somente para inicializar campos estáticos, caso em que só é necessário garantir que a inicialização estática ocorre antes do primeiro acesso de um campo estático.The beforefieldinit comportamento é apropriado para esses e a maioria dos outros tipos. Somente é inadequado quando estado global afeta a inicialização estática e uma das seguintes opções for verdadeira:

  • O impacto sobre o estado global é caro e não é necessário se o tipo não é usado.

  • Os efeitos de estado global podem ser acessados sem acessar quaisquer campos do tipo estático.

Como corrigir violações

Para corrigir uma violação dessa regra, inicializar todos os dados estáticos quando ela é declarada e remova o construtor estático.

Quando suprimir avisos

É seguro eliminar um aviso essa regra se o desempenho não é uma preocupação; ou se alterações de estado global devido a inicialização estática são caras ou devem ser garantidas para ocorrer antes que um método estático do tipo é chamado ou uma instância do tipo é criada.

Exemplo

O exemplo a seguir mostra um tipo, StaticConstructor, que viola a regra e um tipo NoStaticConstructor, que substitui o construtor estático com inicialização embutido para satisfazer a regra.

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");
      }
   }
}

Observe a adição do beforefieldinit sinalizar na definição de MSIL para o NoStaticConstructor classe.

.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

Regras relacionadas

Inicializar valor tipo campos estático embutido