您的位置:首页 > Web前端

Initialize reference type static fields inline

2006-05-26 15:18 477 查看
Visual Studio Team System
Initialize reference type static fields inline

TypeName

InitializeReferenceTypeStaticFieldsInline

CheckId

CA1810

Category

Microsoft.Performance

Breaking Change

NonBreaking

var ExpCollDivStr=ExpCollDivStr;
ExpCollDivStr = ExpCollDivStr + "ctl00_LibFrame_ctl024b6b030,";
var ExpCollImgStr = ExpCollImgStr;
ExpCollImgStr = ExpCollImgStr + "ctl00_LibFrame_ctl02img,";



Cause


A reference type declares an explicit static constructor.

var ExpCollDivStr=ExpCollDivStr;
ExpCollDivStr = ExpCollDivStr + "ctl00_LibFrame_ctl03adbbe3c,";
var ExpCollImgStr = ExpCollImgStr;
ExpCollImgStr = ExpCollImgStr + "ctl00_LibFrame_ctl03img,";



Rule Description


When a type declares an explicit static constructor, the just-in-time (JIT) compiler adds a check to each of the type's static methods and instance constructors to ensure that the static constructor was previously called. Static initialization is triggered when any static member is accessed or when an instance of the type is created. However, static initialization is not triggered if you declare a variable of the type but do not use it, which can be important if the initialization changes global state.

When all static data is initialized inline and an explicit static constructor is not declared, Microsoft intermediate language (MSIL) compilers add the beforefieldinit flag and an implicit static constructor, which initializes the static data, to the MSIL type definition. When the JIT compiler encounters the beforefieldinit flag, in most cases the static constructor checks are not added. Static initialization is guaranteed to occur at some time before any of the static fields are accessed but not before a static method or instance constructor is invoked. Note that static initialization can occur at any time after a variable of the type is declared.

Static constructor checks can reduce performance. Often a static constructor is used only to initialize static fields, in which case it is only necessary to ensure that static initialization occurs before the first access of a static field. The beforefieldinit behavior is appropriate for these and most other types. It is only inappropriate when static initialization affects global state and one of the following is true:

The affect on global state is expensive and is not needed if the type is not used.

The global state effects can be accessed without accessing any static fields of the type.

var ExpCollDivStr=ExpCollDivStr;
ExpCollDivStr = ExpCollDivStr + "ctl00_LibFrame_ctl041de459b,";
var ExpCollImgStr = ExpCollImgStr;
ExpCollImgStr = ExpCollImgStr + "ctl00_LibFrame_ctl04img,";



How to Fix Violations


To fix a violation of this rule, initialize all static data when it is declared and remove the static constructor.

var ExpCollDivStr=ExpCollDivStr;
ExpCollDivStr = ExpCollDivStr + "ctl00_LibFrame_ctl05754eefa,";
var ExpCollImgStr = ExpCollImgStr;
ExpCollImgStr = ExpCollImgStr + "ctl00_LibFrame_ctl05img,";



When to Exclude Warnings


It is safe to exclude a warning from this rule if performance is not a concern; or if global state changes due to static initialization are expensive, or must be guaranteed to occur before a static method of the type is called or an instance of the type is created.

var ExpCollDivStr=ExpCollDivStr;
ExpCollDivStr = ExpCollDivStr + "ctl00_LibFrame_ctl0657aa5da,";
var ExpCollImgStr = ExpCollImgStr;
ExpCollImgStr = ExpCollImgStr + "ctl00_LibFrame_ctl06img,";



Example


The following example shows a type, StaticConstructor, that violates the rule and a type, NoStaticConstructor, that replaces the static constructor with inline initialization to satisfy the rule.

Visual Basic

Copy Code

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


C#

Copy Code

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


Note the addition of the beforefieldinit flag on the MSIL definition for the NoStaticConstructor class.

Output

.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


var ExpCollDivStr=ExpCollDivStr;
ExpCollDivStr = ExpCollDivStr + "ctl00_LibFrame_ctl0924b1a87,";
var ExpCollImgStr = ExpCollImgStr;
ExpCollImgStr = ExpCollImgStr + "ctl00_LibFrame_ctl09img,";



Related Rules


Initialize value type static fields inline
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: