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


    代码如下,在执行Encoding.GetEncoding(“gb2312”);方法后报错,说没有找到对应编码,经测试,发现是静态构造函数未执行。

    public static class Encodings
    {
        /// 
        /// 注册相关编码
        /// 
        static Encodings()
        {
            // .net core 不再支持gb2312编码 需要手动注册
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
        }
    
        /// 
        /// utf-8编码
        /// 
        public static readonly Encoding UTF_8 = Encoding.UTF8;
        /// 
        /// gb2312编码
        /// 
        public static readonly Encoding GB2312 = Encoding.GetEncoding("gb2312");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    将代码改成这样就恢复正常了:

    public static class Encodings
    {
        /// 
        /// 注册相关编码
        /// 
        static Encodings()
        {
            // .net core 不再支持gb2312编码 需要手动注册
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
            UTF_8 = Encoding.UTF8;
            GB2312 = Encoding.GetEncoding("gb2312");
        }
    
        /// 
        /// utf-8编码
        /// 
        public static readonly Encoding UTF_8;
        /// 
        /// gb2312编码
        /// 
        public static readonly Encoding GB2312;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    推测是编译器认为静态构造函数无用,被优化掉了。
    也可能是静态函数的调用方式并非在类加载时调用,而是在实例化static readonly参数时参数才会调用。

    查找了不少相关资料,并未找到任何证据支持上面的观点。不过我尝试了反编译dll,发现dll中还是有构造函数的,应该没有被优化掉。

  • 相关阅读:
    在本地利用服务器显卡跑代码
    安装使用RocketMQ一套保姆全教程-最快完成SpringBoot使用消息队列demo
    oracle数据库操作—DML
    数据库字段命名
    Language Server for Java 1.0 在VS Code上正式发布
    初识Redis之分布式
    JavaScript简介
    Ceph文件存储
    Javascript知识【jQuery-基本操作】下篇
    KNN算法推理与实现
  • 原文地址:https://blog.csdn.net/weixin_44927769/article/details/132597623