c#静态构造函数 与 构造函数 你是否还记得?
2014-06-07 17:52
260 查看
构造函数这个概念,在我们刚开始学习编程语言的时候,就被老师一遍一遍的教着。亲,现在你还记得静态构造函数的适用场景吗?如果没有,那么我们一起来复习一下吧。
静态构造函数是在构造函数方法前面添加了static关键字之后形成的,并且没有修饰符(public,private),没有参数。
静态构造函数有哪些特点呢:
静态构造函数没有修饰符修饰(public,private),因为静态构造函数不是我们程序员调用的,是由.net 框架在合适的时机调用的。
静态构造函数没有参数,因为框架不可能知道我们需要在函数中添加什么参数,所以规定不能使用参数。
静态构造函数前面必须是static 关键字。如果不加这个关键字,那就是普通的构造函数了。
静态构造函数中不能实例化实例变量。(变量可以分为类级别和实例级别的变量,其中类级别的有static关键字修饰)。
静态函数的调用时机,是在类被实例化或者静态成员被调用的时候进行调用,并且是由.net框架来调用静态构造函数来初始化静态成员变量。
一个类中只能有一个静态构造函数。
无参数的静态构造函数和无参数的构造函数是可以并存的。因为他们一个属于类级别,一个属于实例级别,并不冲突。
静态构造函数只会被执行一次。并且是在特点5中的调用时机中进行调用。
就像如果没有在类中写构造函数,那么框架会为我们生成一个构造函数,那么如果我们在类中定义了静态变量,但是又没有定义静态构造函数,那么框架也会帮助我们来生成一个静态构造函数来让框架自身来调用。
上面几个特点都是理论性的,我们来做一个找错题,帮助我们一起来学习静态构造函数。
VS编译提示的错误信息:
现在我们来做一个有意思的事情,验证静态构造函数的调用时机:
输出结果均为:AAA
我们来分析一下出现这个情况的原因所在,当显示A.strText的时候,因为strText是静态变量,所以框架会调用A的静态构造函数,此时strText的值为AAA.正确
当显示B.strText的时候,因为B继承自A,所以会首先调用A的静态构造函数,但是因为静态构造函数只会调用一次,所以不会调用A的静态构造函数,但是又因为strText属于类A,而不是B,所以B得静态构造函数不会执行,故输出的均为AAA。
但是如果我们把输出更改一下,输出结果就大不一样了。
请注意我在开始部分对类进行了实例化,那么此时的输出结果就是均为BBB。
为什么会有这样的情况出现呢,其实还是要从静态构造函数的调用时机入手。
首先我们实例化了B,此时会调用B的静态构造函数,但是因为strText是A的静态变量,所以首先会先调用A的静态构造函数将strText赋值为AAA,此时又会调用B的静态构造函数将strText赋值为BBB,所以此时strText的值应该为BBB,所以输出均为BBB。
静态构造函数是在构造函数方法前面添加了static关键字之后形成的,并且没有修饰符(public,private),没有参数。
静态构造函数有哪些特点呢:
静态构造函数没有修饰符修饰(public,private),因为静态构造函数不是我们程序员调用的,是由.net 框架在合适的时机调用的。
静态构造函数没有参数,因为框架不可能知道我们需要在函数中添加什么参数,所以规定不能使用参数。
静态构造函数前面必须是static 关键字。如果不加这个关键字,那就是普通的构造函数了。
静态构造函数中不能实例化实例变量。(变量可以分为类级别和实例级别的变量,其中类级别的有static关键字修饰)。
静态函数的调用时机,是在类被实例化或者静态成员被调用的时候进行调用,并且是由.net框架来调用静态构造函数来初始化静态成员变量。
一个类中只能有一个静态构造函数。
无参数的静态构造函数和无参数的构造函数是可以并存的。因为他们一个属于类级别,一个属于实例级别,并不冲突。
静态构造函数只会被执行一次。并且是在特点5中的调用时机中进行调用。
就像如果没有在类中写构造函数,那么框架会为我们生成一个构造函数,那么如果我们在类中定义了静态变量,但是又没有定义静态构造函数,那么框架也会帮助我们来生成一个静态构造函数来让框架自身来调用。
上面几个特点都是理论性的,我们来做一个找错题,帮助我们一起来学习静态构造函数。
public class C { public static string BB; public static C() { BB = "CC"; } public static C(string mm) { BB = mm; } static C() { BB = "Right"; } public C() { BB = "Wrong"; } public C(string mm) { BB = mm; } }
VS编译提示的错误信息:
现在我们来做一个有意思的事情,验证静态构造函数的调用时机:
class Program { static void Main(string[] args) { Console.WriteLine(A.strText); Console.WriteLine(B.strText); Console.Read(); } } public class A { public static string strText; public string Text; static A() { strText = "AAA"; } public A() { Text = "AAAAAAAAAAAAAAAAAAAAAAAAAA"; } } public class B:A { static B() { strText = "BBB"; } public B() { Text = "BBBBBBBBBBBBBBBBB"; } }
输出结果均为:AAA
我们来分析一下出现这个情况的原因所在,当显示A.strText的时候,因为strText是静态变量,所以框架会调用A的静态构造函数,此时strText的值为AAA.正确
当显示B.strText的时候,因为B继承自A,所以会首先调用A的静态构造函数,但是因为静态构造函数只会调用一次,所以不会调用A的静态构造函数,但是又因为strText属于类A,而不是B,所以B得静态构造函数不会执行,故输出的均为AAA。
但是如果我们把输出更改一下,输出结果就大不一样了。
class Program { static void Main(string[] args) { B b = new B(); A a = new A(); Console.WriteLine(A.strText); Console.WriteLine(B.strText); Console.Read(); } } public class A { public static string strText; public string Text; static A() { strText = "AAA"; } public A() { Text = "AAAAAAAAAAAAAAAAAAAAAAAAAA"; } } public class B:A { static B() { strText = "BBB"; } public B() { Text = "BBBBBBBBBBBBBBBBB"; } }
请注意我在开始部分对类进行了实例化,那么此时的输出结果就是均为BBB。
为什么会有这样的情况出现呢,其实还是要从静态构造函数的调用时机入手。
首先我们实例化了B,此时会调用B的静态构造函数,但是因为strText是A的静态变量,所以首先会先调用A的静态构造函数将strText赋值为AAA,此时又会调用B的静态构造函数将strText赋值为BBB,所以此时strText的值应该为BBB,所以输出均为BBB。
相关文章推荐
- c#静态构造函数 与 构造函数 你是否还记得?
- 是否能在构造函数,析构函数中抛出异常?
- the constructor in C# (面试题构造函数是否可以继承和重载的解释)
- JAVA面试题解惑系列(十一)——这些运算符你是否还记得?
- java中子类继承父类时是否继承构造函数呢?
- instanceof的使用: 对象与构造函数在原型链上是否有关系
- 构造函数、析构函数是否要声明为虚函数的问题(网络转载)
- java中子类继承父类时是否继承构造函数呢?
- A::fun();这样调用后, A类的构造函数和析构函数是否会被调用?------不会!
- 构造函数、析构函数是否要声明为虚函数的问题
- C++ 构造函数和析构函数是否可以继承?
- 是否能在构造函数,析构函数中抛出异常?
- java中子类继承父类时是否继承构造函数呢?
- java中子类继承父类时是否继承构造函数
- JAVA面试题解惑系列(十一)——这些运算符你是否还记得?
- C++ 构造函数和析构函数是否可以继承?
- java中子类继承父类时是否继承构造函数呢?
- java中子类继承父类时是否继承构造函数呢?
- 定义平面中的一个Circle类, 1编写一个无参数构造函数, 2编写一个有参的构造函数 3在主函数中调用无参构造函数生成圆的实例c1,调用有参构造函数生成圆的实例c2,调用实例方法判断c1和c2是否重
- JAVA面试题解惑系列(十一)——这些运算符你是否还记得?