代码如下,在执行Encoding.GetEncoding(“gb2312”);方法后报错,说没有找到对应编码,经测试,发现是静态构造函数未执行。
public static class Encodings
{/// <summary>/// 注册相关编码/// </summary>static Encodings(){// .net core 不再支持gb2312编码 需要手动注册Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);}/// <summary>/// utf-8编码/// </summary>public static readonly Encoding UTF_8 = Encoding.UTF8;/// <summary>/// gb2312编码/// </summary>public static readonly Encoding GB2312 = Encoding.GetEncoding("gb2312");
}
将代码改成这样就恢复正常了:
public static class Encodings
{/// <summary>/// 注册相关编码/// </summary>static Encodings(){// .net core 不再支持gb2312编码 需要手动注册Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);UTF_8 = Encoding.UTF8;GB2312 = Encoding.GetEncoding("gb2312");}/// <summary>/// utf-8编码/// </summary>public static readonly Encoding UTF_8;/// <summary>/// gb2312编码/// </summary>public static readonly Encoding GB2312;
}
推测是编译器认为静态构造函数无用,被优化掉了。
也可能是静态函数的调用方式并非在类加载时调用,而是在实例化static readonly
参数时参数才会调用。
查找了不少相关资料,并未找到任何证据支持上面的观点。不过我尝试了反编译dll,发现dll中还是有构造函数的,应该没有被优化掉。