时间:2021-05-20
静态构造函数是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的静态构造函数了,因为前面已经调用过了,静态函数在整个应用程序域的生命周期中只会调用一次!
请大家多指教啊!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
关于为什么需要创建单例?这里不过多介绍,具体百度知。关于C#创建单例步骤或条件吧1、声明静态变量;2、私有构造函数(无法实例化)3、静态创建实例的方法;至于我这
Javascript并不像Java、C#等语言那样支持真正的类。但是在js中可以定义伪类。做到这一点的工具就是构造函数和原型对象。首先介绍js中的构造函数。Ja
类中的七种语法说明-属性-静态属性-方法-静态方法-类常量-构造函数-析构函数stu_name=$stu_name;echo'__construct','';}
本文以实例形式分析私有构造函数的特点,以及在何种情况下使用私有构造函数。相信对于大家更好的理解C#中的私有构造函数有一定的促进作用。具体如下:一、带私有构造函数
这里直接给出C#类成员一般初始化顺序:子类静态字段子类静态构造子类实例字段父类静态字段父类静态构造父类实例字段父类实例构造子类实例构造为什么说是“一般”初始化顺