静态构造函数的执行时机

简介:

思考一下下面三段这段程序的输出结果:

using  System;
public   class  Type1
{
    
public static int i;
    
static Type1()//显式定义静态构造函数
    {
        Console.WriteLine(
"Explicit: In Type1 Class Constructor");
        i
=1;
    }

}


public   class  Type2
{
        
public static int i = Init(2);//由CSC编译器在编译时隐式创建静态构造函数
        public static int Init(int j)
        
{
        Console.WriteLine(
"Implicit: In Type2 Class Constructor");
        
return j;
        }

}


public   class  MainClass
{
    
static void Main()
    
{
        
//分别用下面三种情况下的Main函数,猜下输出结果:)
    }

}


1. 程序中有访问静态成员:

static   void  Main()
{
     Console.WriteLine(
"In Main Function");
     Console.WriteLine(Type1.i);
     Console.WriteLine(Type2.i);
}


2. 程序中没有访问静态成员,但有访问静态成员所声明的类中的实例成员:

static   void  Main()
{
     Console.WriteLine(
"In Main Function");
     Type1 t1 
= new Type1();
     Type2 t2 
= new Type2();
}


3.既不访问静态成员,也不访问实例成员

static   void  Main()
{
     Console.WriteLine(
"In Main Function");
}


    情况1下,输出编译和运行结果如下:

E:CSC > csc staticfield.cs
Microsoft (R) Visual C# 
2005  编译器 版本  8.00 . 50727.42
用于 Microsoft (R) Windows (R) 
2005  Framework 版本  2.0 . 50727
版权所有 (C) Microsoft Corporation 
2001 - 2005 。保留所有权利。

E:CSC
> staticfield.exe
Implicit: In Type2 Class Constructor
In Main Function
Explicit: In Type1 Class Constructor
1
2

 

    情况2下,输出结果:

E:CSC > staticfield.exe
Implicit: In Type2 Class Constructor
In Main Function
Explicit: In Type1 Class Constructor

 


    情况3下,输出结果:

E:CSC > staticfield.exe
In Main Function

 

     是否跟我们想象中的结果不一样呢?^_^
    根据上面三个测试,我们可以得到如下结论(针对类中有定义静态字段的情况):

if (如果为类显式定义静态构造函数,例如上面的Type1)
{
    
if(程序中有访问该类的任意静态或实例成员)
    
{
         在进入Main函数之后,第一次访问该类中所定义的任何静态或实例成员之前,先调用静态构造函数;
         以后将不再调用该静态构造函数,同一个静态构造函数最多只调用一次!
    }

    
else
    
{
         程序中不调用该类的静态构造函数;
    }

else
{
    
if(程序中有访问该类的任意静态或实例成员)
    
{
         在执行Main函数中的代码之前,先调用静态构造函数;
         以后将不再调用该静态构造函数,同一个静态构造函数最多只调用一次!
    }

    
else
    
{
         程序中不调用该类的静态构造函数;
    }

}

     

本文转自Silent Void博客园博客,原文链接:http://www.cnblogs.com/happyhippy/archive/2007/04/04/710936.html,如需转载请自行联系原作者
相关文章
|
Java 关系型数据库 MySQL
【实训项目】基于JavaWeb的图书销售购物系统
【实训项目】基于JavaWeb的图书销售购物系统
408 0
|
前端开发 JavaScript Oracle
程序员如何成为自由职业者或者数字游民?
程序员如何成为自由职业者或者数字游民?
1193 0
|
前端开发 JavaScript SEO
WordPress 主题与插件有什么区别?
WordPress是一个广泛使用的开源内容管理系统(CMS),因为它非常灵活且易于使用。WordPress的灵活性主要来自于它的主题和插件。WordPress主题和插件都可以扩展和定制WordPress的功能,但它们之间有很大的区别。在本文中,北京六翼带大家讨论WordPress主题和插件之间的区别。
|
17天前
|
人工智能 数据可视化 安全
王炸组合!阿里云 OpenClaw X 飞书 CLI,开启 Agent 基建狂潮!(附带免费使用6个月服务器)
本文详解如何用阿里云Lighthouse一键部署OpenClaw,结合飞书CLI等工具,让AI真正“动手”——自动群发、生成科研日报、整理知识库。核心理念:未来软件应为AI而生,CLI即AI的“手脚”,实现高效、安全、可控的智能自动化。
34817 45
王炸组合!阿里云 OpenClaw X 飞书 CLI,开启 Agent 基建狂潮!(附带免费使用6个月服务器)
|
11天前
|
人工智能 自然语言处理 安全
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
本文介绍了Claude Code终端AI助手的使用指南,主要内容包括:1)常用命令如版本查看、项目启动和更新;2)三种工作模式切换及界面说明;3)核心功能指令速查表,包含初始化、压缩对话、清除历史等操作;4)详细解析了/init、/help、/clear、/compact、/memory等关键命令的使用场景和语法。文章通过丰富的界面截图和场景示例,帮助开发者快速掌握如何通过命令行和交互界面高效使用Claude Code进行项目开发,特别强调了CLAUDE.md文件作为项目知识库的核心作用。
10825 36
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
|
6天前
|
人工智能 JavaScript Ubuntu
低成本搭建AIP自动化写作系统:Hermes保姆级使用教程,长文和逐步实操贴图
我带着怀疑的态度,深度使用了几天,聚焦微信公众号AIP自动化写作场景,写出来的几篇文章,几乎没有什么修改,至少合乎我本人的意愿,而且排版风格,也越来越完善,同样是起码过得了我自己这一关。 这个其实OpenClaw早可以实现了,但是目前我觉得最大的区别是,Hermes会自主总结提炼,并更新你的写作技能。 相信就冲这一点,就值得一试。 这篇帖子主要就Hermes部署使用,作一个非常详细的介绍,几乎一步一贴图。 关于Hermes,无论你赞成哪种声音,我希望都是你自己动手行动过,发自内心的选择!
2276 22
|
29天前
|
人工智能 JSON 机器人
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
本文带你零成本玩转OpenClaw:学生认证白嫖6个月阿里云服务器,手把手配置飞书机器人、接入免费/高性价比AI模型(NVIDIA/通义),并打造微信公众号“全自动分身”——实时抓热榜、AI选题拆解、一键发布草稿,5分钟完成热点→文章全流程!
45717 156
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw

热门文章

最新文章

下一篇
开通oss服务