.NET代码执行顺序探讨

【大模型】大模型知识蒸馏 综述解读(Knowledge Distillation of Large Language Models) 知识蒸馏的(论文)方法总结。归纳了通过数据(如指令、对话、多模态)和训练方法(SFT、RL、数据增强),将复杂技能(如对齐、工具使用、多模态)蒸馏到开源模型的核心框架,附典型模型示例(如Alpaca、LLaVA)。 阅读详情
    通常我们设计一个.NET应用程序,无需考虑过多就可以让我们的程序正确的跑起来。但是,当我们的设计日益复杂时,稍不小心就会因为不清楚.NET代码的执行顺序以及规则而使我们陷入困境。先来个小demo,检查一下你对它了解多少吧。
 1 public class MainTest
 2 {
 3     static void Main(string[] agrs)
 4     {//断点①    (没错,是花括号)
 5         Console.WriteLine(Test1.Getddd());//断点②   (调用静态方法)
 6         Console.WriteLine(Test1.ddd);//断点③   (调用静态字段)
 7     }
 8 };
 9 public class Test1
10 {
11     public static string ddd = Test2.kkk;//断点④
12     public static string Getddd()
13     {
14         return "ddd";//断点⑤
15     }
16 };
17 public class Test2
18 {
19     public static string kkk = "kkk";//断点⑥
20 };
   
    问题一:上面的代码中,我定义了六个断点,你不妨思考一下,六个断点处的代码执行顺序如何。下面有两个观点,你认同哪个呢?
    观点1 : ① -- ⑤ -- ② -- ⑥ -- ④ -- ③
    观点2 : ⑥ -- ④ -- ① -- ⑤ -- ② -- ③
    (如果你还有其他观点,欢迎跟帖讨论)
   
    如果你支持观点1,那你就很值得把这篇文章一看了。如果你肯定观点2是正确的,那说明你已经出师,无需再看下文讲解。
    的确,观点2是正确。上面的代码主要的关键点有:
    1.函数中调用静态字段。
    2.函数中调用静态方法。
    3.类的静态字段中调用另一个类的静态字段。
    我们知道,类中的静态字段在整个程序中只会初始化一次,而静态方法却是每调用一次都要执行一次。
   
    问题二:我们的仅有一次的类中的静态字段是何时被初始化的呢?
    观点1 : 应用程序加载时就先把所有的静态字段都初始化一次。
    观点2 : 当第一次调用到某个静态字段的语句时才去初始化那个静态字段,并且把这个类中的其他静态字段也初始化。
    观点3 : 当第一次调用到某个静态字段的语句时才去初始化那个静态字段,并且只初始化这一个静态字段。
   
    又要做选择了,你选择哪个呢?答案是~~~~~~~~~~~都不对-_-!
    正确的初始化时机,我的理解是:当某个类第一次被实例化或类的静态方法第一次被调用或类的静态字段第一次准备要调用前,就尝试去初始化这个类的所有静态字段。为了验证这一点,我可以把上面的代码简单的修改一下:
 1 public class MainTest
 2 {
 3     static void Main(string[] agrs)
 4     {//断点①    (没错,是花括号)
 5         Console.WriteLine(Test1.Getddd());//断点②   (测试调用静态方法时类Test1中执行的顺序如何)
 6         //Test1 t1 = new Test1();//断点③ (测试初始化类时类Test1中执行的顺序如何)
 7     }
 8 };
 9 public class Test1
10 {
11     public static string ddd = "kkk";//断点④
12     public static string Getddd()
13     {
14         return "ddd";//断点⑤
15     }
16 };

   
    我们可以看到,代码执行的顺序是:1 -- 4 -- 5 -- 2 。第一次调用了Test1.Getddd()方法时,就对静态字段ddd进行了初始化。我们可以修改代码,在Main函数里先实例化一个Test1,这时我们可以看到当实例化一个类的时候静态字段也被初始化了。
   
    问题三:为什么说上文说"类中的静态字段第一次准备要调用之前"?

    "准备要调用之前"指的是一个类中(如第一段代码中的Class Test1中执行初始化ddd时要调用到的Class Test2中的静态字段kkk)或是在一个函数体中(如第一段代码中Main函数体中将要调用的Class Test1中的静态字段ddd)中将要调用到某个类的静态字段时,编译器会首先检查到这一情况,最先将该静态字段所属的类中的所有的静态字段初始化,再开始执行类或函数中要执行的代码。这就说明了为什么第一段代码中没有先执行断点①而是先去初始化了那些静态字段。
   
    因此,总结如上,头脑中应该对于一个类、一个静态字段、一个静态方法、一个静态属性(执行顺序和静态方法几乎一样)、类中的构造函数等等的执行先后顺序有了比较清晰的了解。因此我个人总结了如下(希望批评指正):
    1.当一个类被实例化时,首先检查类中的静态字段是否已经初始化,如果没有初始化,将最先执行静态字段的初始化代码。(如果静态字段的初始化代码中又调用了另一个类中的静态字段,将最优先执行另一个类中的静态字段的初始化。)接着,将执行非静态字段的代码,然后再执行类的构造函数。
    2.当调用类的静态方法或属性时,也是首先检查类中的静态字段是否已经初始化,如果没有初始化,将最先执行静态字段的初始化代码。接着再执行静态方法或属性内部的代码。
    3.某个函数体中存在使用了某个类的静态字段时,无论静态字段在函数体的什么位置,只要这个静态字段没有被初始化,将优先于执行这个函数之前,执行该静态字段的初始化(实际上将该类中的所有静态字段都初始化了)。

我自己的理解是只在类实例化或者访问类的静态变量时才初始化类中所有的静态变量和一般变量,然后再执行这个函数

 


最新扣子智能体教程:手把手教你接入抖音评论区,实现自动回复 摘要:本文介绍如何利用扣子(Coze)平台搭建智能体实现抖音评论自动回复。从准备工作(账号注册、权限申请)到智能体创建(提示词优化、模型选择),再到抖音API接入和自动回复逻辑设置,详细说明了每个步骤的操作方法。文章还提供了回复模板示例和优化建议,帮助提升互动效率。通过这套方案,创作者可以显著减轻评论区管理压力,增强用户互动体验。(149字) 阅读详情

相关推荐

前端开发学习--登录和注册页面设计(html和css,可完成两个页面点击切换)

今天学习了登录和注册页面的设计,主要是HTML和CSS部分,注册和切换采用了Js代码进行,后面将通过js进行填写内容的验证,进而可通过JSP跳转到Servlet进行DAO数据的校验,这属于后端部分了。 总体设计思路:整个页面设计可以分为主体(content)、头部(content-header)、内容(content-body)三个部分组成,其中是主体是根部,包含了头部和内容,头部和内容各自下设两...

weixin_43691879的博客 1万+

.NET前后台的执行顺序

首先,据我理解,前台指.aspx,后台指.cs

u012155427的专栏 774

DirectX修复工具使用技巧之二——手动修复C++创建失败的文件

最后更新:2021-2-25 随着V4.0正式版的发布,近来有部分用户来咨询如何解决C++文件创建失败的问题。在此我将以解决最常见的C++2015-2019文件创建失败为例,向大家演示一下在线修复的方法,其他C++或文件的方法大同小异。此次操作以Windows 7为例,其他系统相应参考即可。 首先,如果希望程序能手动在线修复创建失败的失败,请首先确定您使用的V4.0.2版或更高版本,老版本不支持此功能。查看程序版本的方式可以把鼠标放在DirectX Repair.e...

VBcom的专栏 6万+

.NET程序中常用的代码

1. 打开新的窗口并传送参数:  传送参数:      response.write("<script>window.open(’*.aspx?id="+this.DropDownList1.SelectIndex+"&id1="+...+"’)</script>")     接收参数:      string a = Request.QueryString("id");   string b =

Shadow的专栏 4361

LK32T102 单片机 操作GPIO实现流水灯(1)

前言: LK32T10232(32位)单片机是一款专为电机控制器和数字电源开发的高性能 MCU。采Cortex-M0 内核,最高工作频率可达 72Mhz,ADC 采样速率 达 1Msps。同时具备协处理器单元可满足各种乘法、除法、移位以及各种 复杂函数运算。 LK32T102(32位)支持单电源供电,且内嵌高精度高速及低速振荡器,以及具备 多种低功耗工作模式。同时,集成了多路增强型 PWM,多通道模拟比较 器和高速运算放大器,可满足多种电机及功率控制应用,并简化系统成本。...

qq_58676187的博客 3189

LabVIEW多设备采集实战:1个程序同时控制3个RS485 Modbus仪表

本文详细介绍了如何使用LabVIEW实现多设备RS485 Modbus同步采集,涵盖硬件架构设计、多线程通信框架搭建、数据帧解析技巧及性能优化策略。通过实际项目案例,展示如何解决端口冲突、数据解析错误等工业自动化常见问题,提升采集系统实时性与可靠性。

qsc901234的博客 303

构造函数执行顺序

父类的静态代码块—>子类的静态代码块—>主方法(执行哪个程序就执行哪个程序的主方法)—>父类的非静态代码块—>父类的无参构造函数—>子类的非静态代码块—>子类的无参构造函数(若实际子类执行的是有参构造函数,则不执行无参构造函数)—>成员函数(指定执行哪个就执行哪个成员函数,若重写了父类成员函数,则只执行子类的成员函数)

u013506910的专栏 638

运维颠覆!一文解锁AI赋能运维实战秘籍,效率飙升!

将AI应用于运维工作是一场极具价值的变革,从故障预测与诊断到自动化任务执行,再到资源管理优化,AI都展现出巨大潜力。尽管在实践过程中会面临数据质量、模型复杂性等挑战,但通过合理的技术选型和解决方案,我们能够充分挖掘AI的优势,实现运维工作的高效、智能转型。持续探索和创新AI在运维领域的应用,将为企业的数字化发展提供坚实保障。在科技飞速发展的当下,运维领域正经历着深刻变革,AI的融入成为提升运维效率与质量的关键。本文将深入实战,带你领略AI如何在运维各环节大显身手,让你的运维工作开启智能高效新模式。

探索云原生与智能化驱动下的安全运维新范式。关注DevSecOps、可观测性、AIOps等前沿领域,与您共赴技术前沿。 401

GridView 删除按钮事件执行顺序

当GridView里面有一个删除按钮时,我用的是btndel 给他添加事件 btndel_Click 输出button run再添加GridView1_RowCommand 方法 输出"RowCommand Run"再添加GridView1_RowDeleting 方法 输出 "RowDeleting Run"最后 执行页面,点击删除按钮 ,可见输出顺序是button run RowCommand

yjmtv0817的专栏 1080

Simulink仿真模块 - Data Type Conversion

Data Type Conversion将输入信号转换为指定的数据类型 在仿真库中的位置为: Simulink / 常用模块 Simulink / Signal Attributes 模型为: 说明 DataTypeConversion模块可将任何 Simulink®数据类型的输入信号转换为您指定的数据类型。 注意 要通过指定模块参数来控制输出数据类型,或者要从下游模块继承数据类型,使用DataTypeConversion模块。要...

jk_101的博客 2520

路径跟踪 | 图解纯追踪算法Pure Pursuit(附ROS C++/Python/Matlab仿真)

纯追踪算法(Pure Pursuit)参考了人类驾驶行为,其基本思想是在待跟踪路径上设置预瞄点(goal-ahead),通过简单的几何方法驱动机器人跟踪预瞄点直至抵达目标位置.本文详细推导纯追踪算法的理论原理及其变种——自适应纯追踪算法(APP)和规范化纯追踪算法(RPP),并提供ROS C++/Python/Matlab三种仿真实现加深理解

FRIGIDWINTER的博客 8411

ASP.NET学习笔记(五)

第五章实现和使用ASP.NET对象的方法。在方法中的代码执行顺序有三种,第一种为顺序执行,第二种为选择执行,第三种为循环执行。选择执行就是有选择的去执行,选择语句有if/else结构。switch结构。if语句 if(表达式){条件为真时希望运行的代码块}else{条件为假时希望运行的代码块}switch语句 switch(测试表达式){ case value;//语句break;case val

liang_704959721的专栏 839

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

ASP.NET 前台Javascript调用后台代码 / 后台调用前台Javascript

1:ASP.NET 前台Javascript调用后台代码 1.1:前台Javascript 1 <script> 2 function CallCs() { 3 var str = "<%=GetStr()%>"; 4 alert(str); 5 } 6 </script> 7 ...

angnienong7638的博客 444

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

webform页面加载顺序

webform页面加载顺序 场景:主页面引入了多个用户控件,其中某一个用户控件上有一个文本框,页面加载的时候,用jQuery隐藏起来。点击提交按钮(服务区控件的按钮),弹出alert,这个时候,原本隐藏起来的用户控件的文本框,样式全部失效,也无法隐藏起来了。 原因:隐藏文本框的JS 代码,写在了用户控件上。点击提交按钮,页面会重新走一遍webform生命周期。在弹出alert的时候,控件已经加...

cxu123321的博客 573

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

.net 服务器异步注册js,asp.net后台注册js的四种方法分享

1. 用Response.Write方法代码如下:Response.Write("alert("keleyi.com");");此方法缺陷就是不能调用脚本文件中的自定义的函数,只能调用内部函数,具体调用自定义的函数只能在Response.Write写上函数定 义,比如Response.Write("function myfun(){}");2.用ClientScript类代码如下:在想调用某个ja...

weixin_30099269的博客 190

c#再总结一下性能杀手

1. Dictionary 性能很差,用int比用string做索引快30%左右。 2. typeof / type.Assembly / type.Assemlby.XXX 等操作 性能超级差。几乎差了50%!!! 简直是恶劣! 3. 2010-06-07:0548在测试remoting的时候,竟然发现了foreach/for使程序性能降低了一倍。如果是按照流水线去写代码,使用300ms,如果是...

weixin_34384915的博客 81

探讨:ASP.NET技术的学习顺序问题

摘要:很多人对于ASP.NET的入门和学习顺序比较迷茫,今天让我们一起来跟随作者的思路学习探讨ASP.NET的学习顺序问题,希望有所帮助。   如果你已经有较多的面向对象开发经验,跳过以下这两步:   第一步 掌握一门.NET面向对象语言,C#或VB.NET。   我强烈反对在没系统学过一门面向对象(OO)语言的前提下去学ASP.NET。 ASP.NET是一个全面向对象的技术...

weixin_30951231的博客 242

VS.net 2005的卸载顺序

        同时安装SQL Server 2000和VS.NET 2005以后,企业管理器就打不开了,那也难怪,它和SQL Server 2005才是绝配,没办法,只好卸载掉VS.NET 2005,装VS.NET 2003,但是卸载的时候在控制面板里面如果卸载的顺序不对的话,可能卸载不干净,有了几次这样的经历之后,把大致顺序总结如下:1、Microsoft Visual Studio 2005

Camio007---(Not Null,Unique) 2898
上一篇: ref与out之比较
下一篇: 20080324----20080330
NETZHOU
博客等级 码龄24年 10粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值