代码如下,在执行Encoding.GetEncoding("gb2312");方法后报错,说没有找到对应编码,经测试,发现是静态构造函数未执行。
C#
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");
}
将代码改成这样就恢复正常了:
C#
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中还是有构造函数的,应该没有被优化掉。