关于静态构造函数,及相关问题
前言:
谈起构造函数,从C++开始,就开始接触了。然而前几天见到C#中的静态构造函数问题,还是感觉相对陌生,遂再来看一看。
解析:
先看代码,演示构造函数的使用情况:
// Description: 演示静态构造函数的相关
// CopyRight: http://www.cnblogs.com/yangmingming
// Notes: 用一具体实例演示之
public class A
{
public static int a;
static A()
{
a++;
}
public A()
{
a++;
}
}
class Program
{
static void Main(string[] args)
{
A a = new A();
A a2 = new A();
Console.WriteLine("The value of static a is {0}",A.a );
}
}
// CopyRight: http://www.cnblogs.com/yangmingming
// Notes: 用一具体实例演示之
public class A
{
public static int a;
static A()
{
a++;
}
public A()
{
a++;
}
}
class Program
{
static void Main(string[] args)
{
A a = new A();
A a2 = new A();
Console.WriteLine("The value of static a is {0}",A.a );
}
}
对于调试结果,居然为:
为什么呢?中间肯定有问题,或者所不曾清晰地规律。原来问题在于 静态构造函数 上。
解析:
原来静态构造函数,只在加载类时执行一次,即使实例化多个对象,其也至多执行一次,且是在实例化对象,或类使用其中成员前执行。见下述代码:(由前述代码,稍微修改)
// Description: 演示静态构造函数的相关
// CopyRight: http://www.cnblogs.com/yangmingming
// Notes: 用一具体实例演示之
public class A
{
static A()
{
Console.WriteLine("Static A");
}
public A()
{
Console.WriteLine("Public A");
}
}
class Program
{
static void Main(string[] args)
{
A a = new A();
A a2 = new A();
}
}
// CopyRight: http://www.cnblogs.com/yangmingming
// Notes: 用一具体实例演示之
public class A
{
static A()
{
Console.WriteLine("Static A");
}
public A()
{
Console.WriteLine("Public A");
}
}
class Program
{
static void Main(string[] args)
{
A a = new A();
A a2 = new A();
}
}
而结果为:
即验证了上述的解释。然而对于静态构造函数,还有几点需要说明,见附:
附:
- 静态构造函数,是无参函数,且一个类也只能有一个静态构造函数,因为静态构造函数只能访问类的静态成员,而不能访问实例成员;
- 静态构造函数,没有访问修饰符,因为C#从来不会调用它,即加上private或者public是没有意义的;