静态构造函数的执行时机

简介:

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

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,如需转载请自行联系原作者
相关文章
|
6月前
|
Java 编译器
全面解析JVM加载中初始化的时机
全面解析JVM加载中初始化的时机
|
7月前
|
编译器 数据安全/隐私保护 C++
【类与对象】封装&对象的初始化及清理
【类与对象】封装&对象的初始化及清理
|
7月前
|
定位技术 API C++
单例,函数的三种调用方式
单例,函数的三种调用方式
42 0
|
7月前
|
安全 编译器 C++
C++类与对象【对象的初始化和清理】
C++类与对象【对象的初始化和清理】
C++类与对象【对象的初始化和清理】
|
Java API Spring
反射:替对象执行方法
反射:替对象执行方法
100 0
反射:替对象执行方法
|
SQL Java
PicassoProvider初始化时机
在学习Picasso源码的过程中,发现了Picasso对象的初始化不需要传入上下文对象了
|
安全 编译器 C++
C++对象的初始化和清理之构造函数和析构函数分析与实例(一)
对象的初始化和清理 • 生活中我们买的电子产品都基本会有出厂设置,在某一天我们不用时候也会删除一些自己信息数据保证安全 • C++中的面向对象来源于生活,每个对象也都会有初始设置以及 对象销毁前的清理数据的设置。 构造函数和析构函数 对象的初始化和清理也是两个非常重要的安全问题 一个对象或者变量没有初始状态,对其使用后果是未知
370 0
C++对象的初始化和清理之构造函数和析构函数分析与实例(一)
|
存储 缓存 安全
类的加载机制以及类、对象初始化的详细过程
java类的生命周期包括加载、连接(验证、准备、解析)、初始化、使用、卸载五个阶段。初始化的顺序是怎样的呢?
148 0
类的加载机制以及类、对象初始化的详细过程
【错误记录】反射时调用方法及成员报错 ( 执行反射方法 | 设置反射的成员变量 | 设置方法/成员可见性 )
【错误记录】反射时调用方法及成员报错 ( 执行反射方法 | 设置反射的成员变量 | 设置方法/成员可见性 )
185 0