静态构造函数
今天view代码的时候发现了一个类中有两个无参的构造函数,一个internal的,一个static的。我一时没反应过来,基础也打得不太好,于是写了个例子。发现两个都被调用了,而且static总是先被调用。下面是小例子。但其他静态的方法就不能出现同名同参数列表的情况。
class Class1
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
TestConstructor test = new TestConstructor();
// TestConstructor test;
Console.ReadLine();
}
public class TestConstructor
{
static TestConstructor()
{
Console.WriteLine("static");
}
internal TestConstructor()
{
Console.WriteLine("internal");
}
internal void test()
{}
// static void test()
// {}
}
}
一下的来自google搜索:
静态构造函数是实现对一个类进行初始化的方法成员。它一般用于对静态数据的初始化。静态构造函数不能有参数,不能有修饰符而且不能被调用,当类被加载时,类的静态构造函数自动被调用。如:
using System.Data;
class Employee
{
private static DataSet ds;
static Employee()
{
ds = new DataSet(...);
}
...
}
声明了一个有静态构造函数的类Employee。注意静态构造函数只能对静态数据成员进行初始化,而不能对非静态数据成员进行初始化。但是,非静态构造函数既可以对静态数据成员赋值,也可以对非静态数据成员进行初始化。
如果类仅包含静态成员,你可以创建一个private的构造函数:private TestClass() {…},但是private意味着从类的外面不可能访问该构造函数。所以,它不能被调用,且没有对象可以被该类定义实例化。
对于上文的最后一点,我又试了一下。并发现,静态的构造函数在第一次对任意静态成员赋值时被调用。
class Class1
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
Console.WriteLine("Will give A value");
TestPrivateStatic.a = 3;
Console.WriteLine("Done");
TestPrivateStatic.a = 4;
Console.ReadLine();
}
public class TestPrivateStatic
{
public static int a;
static TestPrivateStatic()
{
a = 2;
Console.WriteLine("a has been given value");
}
}
}
就这样了,平时总会发现一些细小的东西,没记下来真是一种损失,现在来弥补。