C#中定义自身静态类在构造函数初始化,请问是怎么运行的?

就是在定义时,应该初始化,当改程序没有初始化,却成功运行,请问是怎么回事?
using System;
class Student
{
public Student(double allow, string demand, string location)
{
this.allow = allow;
this.demand = demand;
this.location = location;
}
public double allow;
public string demand;
public string location;
public static readonly Student Bechelor;
public static readonly Student Master;
public static readonly Student Doctor;
static Student()
{
Bechelor =new Student(200,"student","1#楼");
Master =new Student(1000,"creative","2#楼");
Doctor=new Student(2000,"inventive","3#楼");
}
}
class App
{
public static void Main()
{
Student student1=Student.Bechelor;
Console.WriteLine("该学生每月的津贴为:{0}",student1.allow);
Console.WriteLine("对该学生的培养标准shi:{0}",student1.demand);
Console.WriteLine("该学生住址:{0}",Student.Bechelor.location);
}
}
写错了,第一句话应该是:当改==但该

这个不是静态类,只是静态构造函数,如下
使用静态构造函数时,需要注意几点
1. 一个类中,最多只能有一个静态构造函数,不允许静态构造函数的重载;
2. 不能加任何访问修饰符(public/private/internale等),且不能带有任何参数;
3. 不管创建该类的多少实例,该函数值调用一次;
4. 运行时环境在创建第一个实例时或者在调用任何静态成员之前调用静态构造函数;
5. 它先于任何实例构造函数被调用;

也就是说 Student student1=Student.Bechelor;这行运行的时候,会先运行static Student(),第一行就是Bechelor =new Student(200,"student","1#楼"); 类在这里就实例化了
温馨提示:内容为网友见解,仅供参考
第1个回答  2014-04-26
这是什么问题?怎么没有实例化?Static Student()这个其实就是静态实例化,static是指在程序一开始就建立的实体,一直到程序结束都会存在于内存中。这就是说,在程序一开始就对这些static的实例化进行执行,所以在未进去main方法之前,Static Student()就已经被系统执行过了。所以你调用用静态变量Bechelor ,早在程序一开始就存在于内存中了,只有程序结束的时候,这部分内存才会被释放出来,在程序运行期间,一直可用。
第2个回答  2015-06-19
静态构造函数用于初始化任何静态数据,或用于执行仅需执行一次的特定操作。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数。
静态构造函数具有以下特点:
· 静态构造函数既没有访问修饰符,也没有参数。
· 在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。
· 无法直接调用静态构造函数。
· 在程序中,用户无法控制何时执行静态构造函数。
· 静态构造函数的典型用途是:当类使用日志文件时,将使用这种构造函数向日志文件中写入项。
· 静态构造函数在为非托管代码创建包装类时也很有用,此时该构造函数可以调用 LoadLibrary 方法。
静态类和类成员用于创建无需创建类的实例就能够访问的数据和函数。静态类成员可用于分离独立于任何对象标识的数据和行为:无论对象发生什么更改,这些数据和函数都不会随之变化。当类中没有依赖对象标识的数据或行为时,就可以使用静态类。
类可以声明为static的,以指示它仅包含静态成员。不能使用 new关键字创建静态类的实例。静态类在加载包含该类的程序或命名空间时由 .NET Framework 公共语言运行库 (CLR) 自动加载。
使用静态类来包含不与特定对象关联的方法。例如,创建一组不操作实例数据并且不与代码中的特定对象关联的方法是很常见的要求。您应该使用静态类来包含那些方法。
静态类的主要功能如下:
· 它们仅包含静态成员。
· 它们不能被实例化。
· 它们是密封的。
· 它们不能包含实例构造函数(C# 编程指南)。
因此创建静态类与创建仅包含静态成员和私有构造函数的类大致一样。私有构造函数阻止类被实例化。
使用静态类的优点在于,编译器能够执行检查以确保不致偶然地添加实例成员。编译器将保证不会创建此类的实利。
静态类是密封的,因此不可被继承。静态类不能包含构造函数,但仍可声明静态构造函数以分配初始值或设置某个静态状态。有关更多信息,请参见静态构造函数(C# 编程指南)。
第3个回答  2014-04-26
"写错了,第一句话应该是:当改==但该"
这是要让人吐血么

关于C#中的静态构造函数和静态成员
1、在一个程序执行过程中,静态构造函数值执行一次 2、静态构造器在类的静态成员初始化之后执行。或者讲编译器会将静态成员初始化语句转换成赋值语句放在静态构造器执行的最开始。如:下面那个类里面 class A { public static int i=100;} 这个类为了给这个静态成员初始化,会自动创建一个静态构造器,...

C语言里面构造函数和析构函数的运用办法
但一旦类中提供了自定义的构造函数,如Point()和Point(double x, double y),则缺省构造函数将不会被提供,这一点要注意。 3) 静态构造函数 静态构造函数是实现对一个类进行初始化的方法成员。它一般用于对静态数据的初始化。静态构造函数不能有参数,不能有修饰符而且不能被调用,当类被加载时,类的静态构造函数...

C#类里面的static变量,不会在程序启动时就初始化吗
会的 如下图,在实例化MainWindow的时候,会先运行静态变量定义语句。如有疑问,继续追问。

c#如何在项目中声明一个静态的List对象?(给出思路即可)
public void Go() { Test.MethodA(); \/\/ 这样可以访问,通过类名直接访问静态方法 Test.iList.Add(2); \/\/ 这样可以访问,通过类名访问静态属性 Test t = new Test();t.MethodB(); \/\/ 这样可以访问,通过实例访问非静态成员 t.MethodA(); \/\/ 这样是【错误】的,实例不能访问静态...

C#中实例构造函数能不能给静态字段初始化?求解答
实例构造函数是不会给静态变量初始化的,只能给静态变量赋新的数值。

C#构造函数只有在对象实例化时才会执行吗?
1、构造函数的功能是对类成员进行初始化。2、类的静态成员需要用静态构造函数初始化。类的非静态成员需要用非静态构造函数初始化。3、静态构造函数只执行一次,时间是当类被装入内存的时候。非静态构造函数执行的次数不定,你new一个变量就执行一次,new十个变量就执行十次。

C#构造函数在是在什么时候调用
构造函数执行顺序,通常情况下:构造函数先调用System.Object的构造函数,再按照继承的层次结构从上往下进行,直到最终要实例化的类为止,即最先调用的是基类的构造函数,但如果类有静态构造函数,且为首次调用该类,则先调用的是子类的静态构造函数,再是父类的静态构造函数,当然静态构造函数只会执行这...

C#代码放到加载事件里和构造函数中有什么区别
构造函数 是一种特殊的方法 主要用来在创建对象时初始化对象 即为对象成员变量赋初始值 总与new运算符一起使用在创建对象的语句中 特别的一个类可以有多个构造函数 可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载 首先窗体的Load事件是在窗体加载时执行的 构造函数里的代码是这个...

为什么c#的类的构造函数内不允许使用异步执行
构造函只在实例化这个类的时候执行,执行之后才可以被初始化(静态类的静态构造函数在任何静态类的任何静态方法被调用时构造函数被执行)。实际上这个类初始化的过程就包括了自动执行构造函数。如果你的初始化过程(执行构造函数过程中)需要很长时间才能执行完,那么实际执行起来,初始化 这个对象(类)的...

c# 程序里 什么时候应该用静态方法 什么时候用非静态方法
这样吧,我给你解释一下什么是静态方法,你就自己知道在什么时候用了。静态的方法就在在程序启动的时候,系统自己建立一个该方法的实例在内存里面,不需要我们在手动去实例该方法,可以直接调用,还有就是该实例会在内存中占一定的内存空间,这个内存空间只要程序不退出就会一直占用,所以在内存比较小的时候...

相似回答