静态构造函数

今天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");
  }
 }
 }

就这样了,平时总会发现一些细小的东西,没记下来真是一种损失,现在来弥补。

posted on 2005-11-21 20:32  栖息的熊  阅读(1048)  评论(0编辑  收藏  举报

导航