C#中静态构造函数的几点说明介绍

 更新时间:2014年01月17日 10:04:39   作者:  
本篇文章主要是对C#中静态构造函数的几点说明进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助

静态构造函数是C#的一个新特性,其实好像很少用到。不过当我们想初始化一些静态变量的时候就需要用到它了。这个构造函数是属于类的,而不是属于哪里实例的,就是说这个构造函数只会被执行一次。也就是在创建第一个实例或引用任何静态成员之前,由.NET自动调用。

复制代码 代码如下:

class SimpleClass
{
// Static constructor
static SimpleClass()
{
//
}
}

在使用静态构造函数的时候应该注意几点:

1、静态构造函数既没有访问修饰符,也没有参数。因为是.NET调用的,所以像public和private等修饰符就没有意义了。

2、是在创建第一个类实例或任何静态成员被引用时,.NET将自动调用静态构造函数来初始化类,也就是说我们无法直接调用静态构造函数,也就无法控制什么时候执行静态构造函数了。

3、一个类只能有一个静态构造函数。

4、无参数的构造函数可以与静态构造函数共存。尽管参数列表相同,但一个属于类,一个属于实例,所以不会冲突。

5、最多只运行一次。

6、静态构造函数不可以被继承。

7、如果没有写静态构造函数,而类中包含带有初始值设定的静态成员,那么编译器会自动生成默认的静态构造函数。
 

静态构造函数趣谈!
类的静态构造函数也叫类型构造器,静态构造器,他调用的时刻由CLR来控制:

CLR会选择如下时间之一来调用静态构造函数:
 1,在类型的第一个实例创建之前,或类型的非继承字段或成员第一次访问之前。这里的“之前”,代表前后衔接的意思。这里的时刻是精确的!

 2,在非继承的静态字段或成员第一次访问之前的某个时刻,具体时刻不定!

由于调用的时刻不确定,所以我们最好不要编写依赖于特定的静态构造函数的执行顺序的代码,这样很容易产生不可预料的后果!

下面大家看看以下的Demo,我们来更加深入的看看静态构造函数的一些有趣的行为:

Demo1:

复制代码 代码如下:

static void Main(string[] args)
{
Console.WriteLine(B.strText); 
}
public class A
{
public static string strText;
static A()
{
strText = "aaaa"; 
}
}
public class B : A
{
static B()
{
strText = "bbbb";  
}
}

大家猜猜结果是什么,可能有人认为输出的是bbbb,因为访问B.strText需要调用B类的静态构造函数static B()。实际上输出的结果是aaaa,因为strText是类A的静态字段,而类B只是继承了这个字段,所以这里会调用类A的静态构造函数static A(),所以输出结果是aaaa。这也没有什么真正可说的,相信大家都能看出这个结果的。

下面看看第二个Demo:

Demo2:

复制代码 代码如下:

static void Main(string[] args)
{
B b = new B(); 
A a = new A();

Console.WriteLine(B.strText); 

}
public class A
{
public static string strText;
static A()
{
strText = "aaaa";  
}
}
public class B : A
{
static B()
{
strText = "bbbb";  
}
}


大家猜猜输出结果是什么,可能有人认为会输出aaaa,理由是new B()之前会调用static B(),然后new A()之前需要调用static A,这样结果是aaaa,但是实际情况并非如果,正确的结果是bbbb,原因如下:

在执行  new B(); 之前,B类的静态构造函数会调用,也就是会调用:
static B()
{
 strText="bbbb";
}

当执行到strText=“bbbb"的时候,这时需要访问strText字段,而B的strText字段是从A类继承的,所以这里需要会先调用:
static A()
{
 strText="aaaa";
}

执行这个函数以后strText的值是aaaa

然后代码又回到static B()中,这时才执行static B()中的strText="bbbb"这行,所以strText这时的值是bbbb

当执行A a=new A();的时候,不会在调用A的静态构造函数了,因为前面已经调用过了,静态函数在整个应用程序域的生命周期中只会调用一次!

请大家多指教啊!

相关文章

  • C#中实现CAN通信的使用

    C#中实现CAN通信的使用

    本文主要介绍了C#中实现CAN通信的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-04-04
  • C#模拟浏览器实现自动操作

    C#模拟浏览器实现自动操作

    这篇文章主要为大家详细介绍了如何使用C#实现模拟浏览器实现自动操作,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-11-11
  • C#实现的SQL备份与还原功能示例

    C#实现的SQL备份与还原功能示例

    这篇文章主要介绍了C#实现的SQL备份与还原功能,结合具体实例形式分析了C#操作数据库实现SQL备份与还原相关的控件、SQL连接、文件等操作技巧,需要的朋友可以参考下
    2017-06-06
  • 解决Unity无限滚动复用列表的问题

    解决Unity无限滚动复用列表的问题

    这篇文章主要介绍了Unity无限滚动复用列表,无限滚动复用ScrollView就是解决这种问题,还可以用来做朋友圈,聊天等,需要的朋友可以参考下
    2022-04-04
  • C#简单发送email的方法

    C#简单发送email的方法

    这篇文章主要介绍了C#简单发送email的方法,涉及C#发送Email的相关技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • C#定义简单的反射工厂实例分析

    C#定义简单的反射工厂实例分析

    这篇文章主要介绍了C#定义简单的反射工厂的用法,实例分析了反射工厂的原理与使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • C#实现伪装文件夹功能

    C#实现伪装文件夹功能

    这篇文章主要为大家详细介绍了如何利用C#实现伪装文件夹的功能,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12
  • C#中Array的存储结构简单介绍

    C#中Array的存储结构简单介绍

    本文将从一个数组的基础操作开始,逐步来推导数组的在C#基础操作、数组在CoreCLR的维护策略,数组在C++的内存分配等阶段具体是如何实现的,感兴趣的朋友跟随小编一起看看吧
    2023-11-11
  • 基于c#用Socket做一个局域网聊天工具

    基于c#用Socket做一个局域网聊天工具

    目前基于Internet的即时聊天工具已经做的非常完美,本文介绍了基于c#用Socket做一个局域网聊天工具,有需要的朋友可以看一下。
    2016-10-10
  • C#仪器数据文件解析Excel文件的方法浅析(xls、xlsx)

    C#仪器数据文件解析Excel文件的方法浅析(xls、xlsx)

    这篇文章主要给大家介绍了关于C#仪器数据文件如何解析Excel文件的方法,包括解析xls、xlsx两种格式,文中介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-10-10

最新评论