C# 构造函数
构造函数
构造函数分为:实例构造函数,静态构造函数,私有构造函数。
实例构造函数
1、构造函数的名字与类名相同。
2、使用 new 表达式创建类的对象或者结构(例如int)时,会调用其构造函数。并且通常初始化新对象的数据成员。
3、除非类是静态的,否则会为没有构造函数的类,自动生成一个默认构造函数,并使用默认值来初始化对象字段。
4、构造函数可以有参数,可以以多态的形式存在多个构造函数。
例:
class CoOrds
{
public int x, y;
// 实例构造函数(默认构造函数)
public CoOrds()
{
x = 0;
y = 0;
}
// 具有两个参数的构造函数
public CoOrds(int x, int y)
{
this.x = x;
this.y = y;
}
// 重写toString方法
public override string ToString()
{
return (String.Format("({0},{1})", x, y));
}
static void Main(string[] args)
{
CoOrds p1 = new CoOrds();
CoOrds p2 = new CoOrds(5, 3);
// 使用重写ToString方法显示结果
Console.WriteLine("CoOrds #1 at {0}", p1);
Console.WriteLine("CoOrds #2 at {0}", p2);
Console.ReadKey();
}
}
/* Output:
CoOrds #1 at (0,0)
CoOrds #2 at (5,3)
*/
其中CoOrds()是构造函数,诸如此类不带参数的构造函数称为“默认构造函数”。
CoOrds(int x, int y)同样也是构造函数,构造函数可以有参数,允许多态。
静态构造函数
静态构造函数具有以下属性:
-
静态构造函数不使用访问修饰符或不具有参数。
-
在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数以初始化类。
-
不能直接调用静态构造函数。
-
用户无法控制在程序中执行静态构造函数的时间。
-
静态构造函数的一种典型用法是在类使用日志文件且将构造函数用于将条目写入到此文件中时使用。
-
静态构造函数对于创建非托管代码的包装类也非常有用,这种情况下构造函数可调用
LoadLibrary
方法。 -
如果静态构造函数引发异常,运行时将不会再次调用该函数,并且类型在程序运行所在的应用程序域的生存期内将保持未初始化。
构造函数与静态构造函数:
class TestClass
{
public static int x = 0;
//构造函数
TestClass()
{
x = 1;
}
//静态构造函数
static TestClass()
{
//第二步,执行x = 2
x = 2;
}
//第一步,程序入口Main最先执行。然后执行public static int x = 0 接着执行静态构造函数。
public static void Main(string[] args)
{
Console.WriteLine("x:{0}", x); //打印,x = 2
TestClass Test = new TestClass();//第三步执行构造函数,此时x = 1
Console.WriteLine("x:{0}", x); //打印 x = 1
Console.Read();
}
}
Main是程序入口,当执行Main的时候,最先执行public static int x = 0
接着执行静态构造函数,此时 x = 2
然后执行Main函数里面的内容,打印 x,此时 x = 2
初始化TestClass,然后会执行构造函数,此时 x = 1
打印 x = 1
同样类型的第二个以及以后的实例将从第5步开始执行,因为类的构造器仅会执行一次。此外,第6步和第7步将被优化,以便构造函数初始化器使编译器移除重复的指令。
那么,在调用某类的静态函数时真正的执行顺序:
1、静态变量 > 静态构造函数 > 静态函数
2、静态变量 > 静态构造函数 > 构造函数