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