C# 静态构造函数未执行 .net core框架

代码如下,在执行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中还是有构造函数的,应该没有被优化掉。

相关推荐
光泽雨9 小时前
动画生命周期
c#·wpf
波力海苔夹心脆67513 小时前
C# StringBuilder 详解:字符串拼接为什么总说要用它?
开发语言·笔记·c#·.net·字符串·stringbuilder·入门教程
淡海水14 小时前
06-03-源码-时间分片与调度策略
unity·c#·gc
丑梨数据14 小时前
法律合同知识库怎么搭:从图片压缩到私有化 RAG 的工程笔记
开发语言·笔记·c#
1-1=015 小时前
.NET Core 输出日志
c#·.net·.netcore
曹牧15 小时前
C#里引用ActiveX控件
开发语言·c#
宇卿.16 小时前
C#委托详解
开发语言·c#
努力,努力再努力16 小时前
零依赖 C# Office 库到底怎么用——四个场景讲透 Wisdom.Office
c#
2501_9307077820 小时前
使用C#代码在 PDF 文档中创建交互操作
pdf·c#·交互
zimoyin1 天前
在 C# 里嵌入 JavaScript:用 Jint 做可热更新的自动化脚本(从入门到踩坑)
javascript·c#·自动化