码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • C# 的静态构造函数和BeforeFieldInit含义


    1、静态初始化函数:

    静态初始化函数,C#语法可以保证在一个程序中只调用一次,但是会去掉默认的beforefieldinit 标记
    (C#默认会加),会导致加载时机的变化:

    • 首次访问该类型的任何静态或实例字段
    • 首次调用该类型的任何静态、实例或虚拟方法

    2、BeforeFieldInit 的意义

    C#在访问静态函数的时候,可能会初始化该类,具体的时机不确定,有可能是程序刚开始就初始化,也可能
    最后访问具体属性的时候才初始化;具体加载时机由CLR决定。

    这篇文章讲的非常不错,可以看看

    3、实现更好的c#懒汉模式加载


    内部类+静态构造函数,CLR保证静态构造函数只会加载一次,

    C#调试代码如下所示,添加和不添加静态构造函数,类的实例化时间会不同

    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);
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

    总结

    • 静态构造函数:静态构造函数的添加需要慎重 (能不加就不加,有BeforeFieldInit标记的,CLR会有优化),要知道添加的具体含义,因为添加了之后会去掉该类的BeforeFieldInit标志,这个标志是CLR优化效率用的,主要作用就是尽量延迟加载(lazy loading),也就是到真正使用的时候才加载。
    • BeforeFieldInit:C#会给类默认加的标志(除非类显示添加了静态构造函数),会进行相应的优化。
  • 相关阅读:
    CAS:190598-55-1_Biotin sulfo-N-hydroxysuccinimide ester生物素化试
    探索新一代活动获客方式,虚拟化活动棋胜一招 | 厂商征集
    AI人工智能(ArtificialIntelligence,AI)、 机器学习(MachineLearning,ML)、 深度学习(DeepLearning,DL) 学习路径及推荐书籍
    如何提升网站图片的加载速度呢?
    基于JavaFX的扫雷游戏实现(四)——排行榜
    贪心算法在找零问题中的应用
    Docker 持久化存储和数据共享_Volume
    连接池及Druid(德鲁伊) 数据库连接池
    kettle入门杂乱笔记
    SSO系统设计框架搭建
  • 原文地址:https://blog.csdn.net/qq_41841073/article/details/126708788
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号