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. java IO【转】

    Java 流在处理上分为字符流和字节流.字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符.字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组. Java 内用 U ...

  2. 【随记】Q号解除限制一波三折

    平日里养了一批QQ号码,前段时间部分号码出问题了,在一个不可能是我登录的时间登录了,而且还异常操作了.结果,被QQ安全中心关进了小黑屋,让我发送手机短信去领回来.这是事情的背景,不细述了. 这个事情的 ...

  3. mongo 杀掉慢的程序killMyRunningOps("12.23.32.21") #####这个是客户端的ip

    mongodb运维(3) db.currentOp与db.killOp命令 2018.08.12 23:55 113浏览  字号 好久没更新mongo运维这块知识了,这次介绍 db.currentOp ...

  4. windows10删除开始菜单中的xbox、人脉、邮件等应用

    1.右键单击PowerShell,选择“以管理员身份运行” 2.输入下面的命令回车,会列出系统中所有已安装应用列表. Get-AppxPackage -AllUsers 从列表中找到你要卸载的应用,并 ...

  5. Fix missing src/main/java folder in Eclipse Maven Project – 2 build path entries are missing

    新建项目没有src/main/java 和 src/main/resources 两个source文件的解决方法: Step 1 : Create a Maven Webapp project. Ri ...

  6. 构建Java并发模型框架

    Java的多线程特性为构建高性能的应用提供了极大的方便,但是也带来了不少的麻烦.线程间同步.数据一致性等烦琐的问题需要细心的考虑,一不小心就会出现一些微妙的,难以调试的错误.另外,应用逻辑和线程逻辑纠 ...

  7. R语言如何将字符串转变为命令执行

    这里用到 eval() 和 parse() 函数.首先使用 parse() 函数将字符串转化为表达式(expression),而后使用 eval() 函数对表达式求解.x <- 1:10a &l ...

  8. Spring JDBC查询数据

    以下示例将展示如何使用Spring jdbc进行查询数据记录,将从student表中查询记录. 语法: String selectQuery = "select * from student ...

  9. c、c++---linux上的GetTickCount函数

    http://blog.csdn.net/guang11cheng/article/details/6865992 http://wenda.so.com/q/1378766306062794

  10. (原创)OpenStack服务如何使用Keystone(一)---Keystone端的操作

    (一)Keystone端的操作 (二)如何在OpenStack服务上部署Keystone中间件 (三)详细配置keystonemiddleware OpenStack项目如果要使用Keystone作为 ...