静态初始化函数,C#语法可以保证在一个程序中只调用一次,但是会去掉默认的beforefieldinit 标记
(C#默认会加),会导致加载时机的变化:
C#在访问静态函数的时候,可能会初始化该类,具体的时机不确定,有可能是程序刚开始就初始化,也可能
最后访问具体属性的时候才初始化;具体加载时机由CLR决定。
内部类+静态构造函数,CLR保证静态构造函数只会加载一次,
using System;
namespace ConsoleApp1
{
class FirstType
{
public static string x = EchoAndReturn("In type initializer FirstType");
public static void F() { Console.WriteLine("FirstType F"); }
FirstType() { Console.WriteLine("FirstType is inited!!"); }
static FirstType() { } // 加了这个函数之后,就会在编译的时候放弃默认的beforeFieldInit字段,当调用静态函数F时,就会初始化静态成员
public static string EchoAndReturn(string s)
{
Console.WriteLine(s);
return s;
}
}
class SecondType
{
public static string x = EchoAndReturn("In type initializer SecondType");
static SecondType() { }
public static void F() { Console.WriteLine("SecondType F"); }
SecondType() { Console.WriteLine("SecondType is inited!!"); }
public static string EchoAndReturn(string s)
{
Console.WriteLine(s);
return s;
}
}
class Program
{
public static void DoSomething(bool which)
{
if (which)
{
FirstType.F();
}
else
{
SecondType.F();
}
}
public static void Main()
{
DoSomething(true);
}
}
}