闲话静态构造函数
这几天在学NHibernate 逛了一些网站,发现张老三的一些入门介绍很不错。看到一个网友转载他的文章
http://philipsslg.cnblogs.com/articles/182149.html
但是在里面看到一个比较怪的地方,引入的代码如下
上面的这句话 public static Sessions(){ } 看起来比较古怪。
按照语义来说,静态的函数(这里是构造函数)不是提供给类本身调用吗?还加一个public的访问修饰符干吗(public的目的是可以提供给其他的类访问),不是自相矛盾吗?
看了一些网友关于静态构造函数的描述
构造函数分为两类:实例构造函数和静态构造函数。
实例构造函数用来初始化特定的对象实例。
静态构造函数也称类构造函数,在第一次使用类之前调用。
静态构造函数自动被调用,不能被显式调用。虽然提供了许多约束条件,但是静态构造函数执行的确切时间和顺序是不确定的:
一个类的静态构造函数在这个类的任何实例被创建前执行。
一个类的静态构造函数在类的任何静态成员被引用前执行。
一个类的静态构造函数在它的所有派生类的静态构造函数执行之后执行。
一个类的静态构造函数从不会被执行一次以上。
http://philipsslg.cnblogs.com/articles/182149.html
但是在里面看到一个比较怪的地方,引入的代码如下
public class Sessions {
private static readonly object lockObj = new object();
private static ISessionFactory _factory;
public static Sessions() {` }
Public static ISessionFactory Factory {
get {
if ( _factory == null ) {
lock ( lockObj ) {
if ( _factory == null ) {
Cfg.Configuration cfg = new Cfg.Configuration ();
cfg.AddAssembly( Assembly.GetExecutingAssembly() );
_factory = cfg.BuildSessionFactory();
}
} // end lock
}
return _factory;
}
}
public static ISession GetSession() {
return Factory.OpenSession();
}
}
private static readonly object lockObj = new object();
private static ISessionFactory _factory;
public static Sessions() {` }
Public static ISessionFactory Factory {
get {
if ( _factory == null ) {
lock ( lockObj ) {
if ( _factory == null ) {
Cfg.Configuration cfg = new Cfg.Configuration ();
cfg.AddAssembly( Assembly.GetExecutingAssembly() );
_factory = cfg.BuildSessionFactory();
}
} // end lock
}
return _factory;
}
}
public static ISession GetSession() {
return Factory.OpenSession();
}
}
上面的这句话 public static Sessions(){ } 看起来比较古怪。
按照语义来说,静态的函数(这里是构造函数)不是提供给类本身调用吗?还加一个public的访问修饰符干吗(public的目的是可以提供给其他的类访问),不是自相矛盾吗?
看了一些网友关于静态构造函数的描述
构造函数分为两类:实例构造函数和静态构造函数。
实例构造函数用来初始化特定的对象实例。
静态构造函数也称类构造函数,在第一次使用类之前调用。
静态构造函数自动被调用,不能被显式调用。虽然提供了许多约束条件,但是静态构造函数执行的确切时间和顺序是不确定的:
一个类的静态构造函数在这个类的任何实例被创建前执行。
一个类的静态构造函数在类的任何静态成员被引用前执行。
一个类的静态构造函数在它的所有派生类的静态构造函数执行之后执行。
一个类的静态构造函数从不会被执行一次以上。