https://blog.csdn.net/cjolj/article/details/56329230

若一个类中有静态构造函数,在首次实例化该类或任何的静态成员被引用时,.NET自动调用静态构造函数来初始化该类。注意是“首次”,即继续实例化该类时,不会调用该类的静态构造函数。

1、实例化时调用静态构造函数
/// <summary>
/// 静态构造函数
/// <remarks>
/// Main主函数在类StaticConstructorTest之中:
///
/// 1.程序被加载时,首先初始化了【静态字段】和【静态构造器】
/// 【1】调用静态字段_count;
/// 【2】调用静态构造函数 static StaticConstructorTest();
/// 【3】调用Main下的obj1代码;
/// </remarks>
/// </summary>
class StaticConstructorTest
{
private static int _count = 0;

static StaticConstructorTest()
{
_count++;
Console.WriteLine(string.Format("static constructor.Count is {0}", _count));
}

StaticConstructorTest()
{
_count++;
Console.WriteLine(string.Format("normal constructor.Count is {0}", _count));
}

static void Main(string[] args)
{
StaticConstructorTest obj1 = new StaticConstructorTest();
StaticConstructorTest obj2 = new StaticConstructorTest();
Console.WriteLine(_count);
Console.ReadKey();
}
}

2、引用静态成员时调用构造函数
/// <summary>
///
/// 静态构造函数:引用静态成员时调用构造函数
///
/// <remarks>
/// Main主函数在类StaticConstructorTest之中:
///
/// 1.在进入main主函数之前,首先初始化了【静态字段】和【静态构造器】
/// 【1】调用静态字段_count;
/// 【2】调用静态构造函数 static StaticConstructorTest();
///
/// </remarks>
/// </summary>
class StaticConstructorTest
{
private static int _count = 0;

static StaticConstructorTest()
{
_count++;
Console.WriteLine(string.Format("static constructor.Count is {0}", _count));
}

StaticConstructorTest()
{
_count++;
Console.WriteLine(string.Format("normal constructor.Count is {0}", _count));
}

static void Main(string[] args)
{
Console.WriteLine(_count);
Console.ReadKey();
}
}

3.实例化时调用静态构造函数(将主函数移到类外面)

/// <summary>
/// 静态构造函数
/// <remarks>
/// 注意:Main主函数在类StaticConstructorTest之外:
///
/// 1. 在 obj1 对象被创建前,StaticConstructorTest 加载静态字段:
/// 【1】调用静态字段_count;
/// 【2】调用静态构造函数 static StaticConstructorTest();
/// 【3】调用构造函数 构建obj1;
///
/// 2.如果注释掉 obj1 和 obj2的构造代码(即:直接访问类的静态属性时,触发初始化【静态字段】和【静态构造器】)
/// 即:直接调用 访问类静态属性Count的代码 Console.WriteLine(StaticConstructorTest.Count),
/// 则调用顺序:
/// 【1】调用静态字段_count;
/// 【2】调用静态构造函数 static StaticConstructorTest();
/// </remarks>
/// </summary>
public class StaticConstructorTest
{
private static int _count = 0;

public static int Count
{
get { return StaticConstructorTest._count; }
}
static StaticConstructorTest() // static ctor
{
_count++;
Console.WriteLine(string.Format("static constructor.Count is {0}", _count));
}
public StaticConstructorTest() // public ctor
{
_count++;
Console.WriteLine(string.Format("normal constructor.Count is {0}", _count));
}
}

class Program
{
static void Main(string[] args)
{
StaticConstructorTest obj1 = new StaticConstructorTest();
StaticConstructorTest obj2 = new StaticConstructorTest();
Console.WriteLine(StaticConstructorTest.Count);
Console.ReadKey();
}
}

4.引用静态成员时调用构造函数(将主函数移到类外面)

注释掉obj1和obj2的实例化代码

class Program
{
static void Main(string[] args)
{
//StaticConstructorTest obj1 = new StaticConstructorTest();
//StaticConstructorTest obj2 = new StaticConstructorTest();
Console.WriteLine(StaticConstructorTest.Count);
Console.ReadKey();
}
}

C#静态构造函数调用机制的更多相关文章

  1. 你好,C++(25)函数调用和它背后的故事5.1.2 函数调用机制

    5.1.2  函数调用机制 在前面的学习中,我们多次提到了“调用函数”的概念.所谓调用函数,就是将程序的执行控制权从调用者(某个函数)交给被调用的函数,同时通过参数向被调用的函数传递数据,然后程序进入 ...

  2. C++ 全局构造函数调用的顺序

    C++的全局类和静态类的构造函数是在main函数之前调用的.但是,不同的类的构造函数以什么顺序调用呢? 对于g++编译器来说,这个顺序是由链接时,文件顺序决定的. 我们用一个例子来说明这一点. 我们有 ...

  3. C++类中一个构造函数调用另一个构造函数

    class A { int a; int b; int c; public: A(int aa, int bb) : a(aa), b(bb),c(0) { cout << "a ...

  4. C# 构造函数调用顺序

    了解C#的一个类的加载过程,对于语言机制的理解和写出高效的语言很有帮助,这里简单介绍一下类的实例的构造函数调用过程.C#类的实例的构造过程是,先为实例的数据字段分配内存,并对所有字段按字节置零(0或者 ...

  5. java初始化构造函数调用顺序

    类初始化时构造函数调用顺序: (1)初始化对象的存储空间为零或null值:  (2)调用父类构造函数:  (3)按顺序分别调用类成员变量和实例成员变量的初始化表达式:  (4)调用本身构造函数. 例子 ...

  6. [Effective JavaScript 笔记]第18条:理解函数调用、方法调用及构造函数调用之间的不同

    面向对象编程中,函数.方法.类的构造函数是三种不同的概念. JS中,它们只是单个构造对象的三种不同的使用模式. 三种不同的使用模式 函数调用 function hello(username){ ret ...

  7. C++中构造函数调用构造函数

    今天想做道矩阵的题目时,却卡在一些编程细节上了,找了好久才发现原来是在构造函数处出了问题,然后上网百度了下,发现这篇文章说得很好:从一道题谈C++中构造函数调用构造函数,很棒! 还补充一点: 看来自己 ...

  8. 1、c#中可以有静态构造方法,而java中没有,例如在单例模式中c#可以直接在静态构造中实例化对象,而java不可以

    1.c#中可以有静态构造方法,而java中没有,例如在单例模式中c#可以直接在静态构造中实例化对象,而java不可以

  9. 你不知道的JavaScript--Item8 函数,方法,构造函数调用

    1.函数调用 Function绝对是JavaScript中的重中之重.在JavaScript中,Function承担了procedures, methods, constructors甚至是class ...

随机推荐

  1. svn 剪短笔记

    post-commit.bat @echo off set REPOS="%1" set TXN="%2" "C:\Program Files\Vis ...

  2. 【LINUX】——linux如何使用Python创建一个web服务

    问:linux如何使用Python创建一个web服务? 答:一句话,Python! 一句代码: /usr/local/bin/python -m SimpleHTTPServer 8686 > ...

  3. Android安装后没有完成和打开按钮

    File apkFile = new File(filePath); Intent intent = new Intent(); intent.setFlags(Intent.FLAG_ACTIVIT ...

  4. 从Container内存监控限制到CPU使用率限制方案

    转自:http://blog.csdn.net/Androidlushangderen/article/details/50282593 前言 最近在运维我们部门的hadoop集群时,发现了很多Job ...

  5. 解决jar包乱码 in 创新实训 智能自然语言交流系统

    今天用eclipse的fat jar插件,打成jar包.之后再命令行运行...程序的功能是切分大的文件...结果是切分的很正确,但是里面的中文都变成了乱码. 最开始以为是在Eclipse中的编码设置有 ...

  6. Selenium常用操作汇总二——如何把一个元素拖放到另一个元素里面(转)

    Q群里有时候会有人问,selenium  webdriver怎么实现把一个元素拖放到另一个元素里面.这一节总一下元素的拖放. 下面这个页面是一个演示拖放元素的页面,你可以把左右页面中的条目拖放到右边的 ...

  7. (笔记)boa服务器make错误

    编译一个linux下的c系统,包含词法和语法分析模块,Linux上用bison和flex.yacc是一个文法分析器的生成器,bison即是yacc的GNU版本.Lex和YACC是用于构造词法分析机和语 ...

  8. C语言中的数组与字符串

    1. 数组与指针: 对于数组,需要注意两点:1, C语言中只有一维数组, 而且数组的大小必须在编译期就作为一个常数确定下来: 2. 对于一个数组,我们只能做两件事:确定数组的大小 和 获得指向该数组下 ...

  9. 使用Photoshop实现雪花飘落的效果

    一.准备工作 软件环境:PhotoshopCS5 实验目的:雪花飘落的效果 二.实验步骤 1,打开素材图片并将原图层复制 2,在菜单栏内选择:滤镜->像素化->点状化,单元格大小选6  提 ...

  10. 第三百七十节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索结果分页

    第三百七十节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索结果分页 逻辑处理函数 计算搜索耗时 在开始搜索前:start_time ...