静态构造函数(Static Constructor)(It performs well in Singleton)
2007-12-10 03:10
549 查看
今天无意间看到了静态构造函数的代码,也许是没怎么见过,觉得新鲜,就顺手写了以下代码,或许我见过,或许我忘记了……呵呵,发布上来自己作个纪念……
发现用来做Singleton模式倒是不错,呵呵……
以上代码可以简化为以下形式
注意上文中static StaticClass() 部分的代码,在传统的singleton中总是需要判断如第一段代码的构造,但是由于静态构造器在第一次调用的时候将会invoke,因此在后续的调用中将会保证实例的存在,即使加了也不为过,可以避免如下形式的代码破坏:
当然按照常规我们最好不要也不应该有set方法,这样我们就可以保证我们的Instance始终是第一次调用的实例了……
发现用来做Singleton模式倒是不错,呵呵……
using System; namespace CA_StaticConstructor { class StaticClass { public static StaticClass Instance { get; set; } public string Name { get; set; } static StaticClass() { if (Instance == null) { Instance = new StaticClass(); } } } class Program { static void Main(string[] args) { StaticClass sc1 = StaticClass.Instance; sc1.Name = "sc1 Instance"; Console.WriteLine(sc1.Name); StaticClass sc2 = StaticClass.Instance; //Without set Name property to Instance Console.WriteLine(sc2.Name); } } }
//Result: //sc1 Instance //sc1 Instance
以上代码可以简化为以下形式
using System;
namespace CA_StaticConstructor
{
class StaticClass
{
public static StaticClass Instance { get; set; }
public string Name { get; set; }
static StaticClass()
{
Instance = new StaticClass();
}
}
class Program
{
static void Main(string[] args)
{
StaticClass sc1 = StaticClass.Instance;
sc1.Name = "sc1 Instance";
Console.WriteLine(sc1.Name);
StaticClass sc2 = StaticClass.Instance;
//Without set Name property to Instance
Console.WriteLine(sc2.Name);
}
}
}
//Result: //sc1 Instance //sc1 Instance
注意上文中static StaticClass() 部分的代码,在传统的singleton中总是需要判断如第一段代码的构造,但是由于静态构造器在第一次调用的时候将会invoke,因此在后续的调用中将会保证实例的存在,即使加了也不为过,可以避免如下形式的代码破坏:
static void Main(string[] args) { StaticClass sc1 = StaticClass.Instance; sc1.Name = "sc1 Instance"; Console.WriteLine(sc1.Name); StaticClass.Instance = null; StaticClass sc2 = StaticClass.Instance; //Without set Name property to Instance Console.WriteLine(sc2.Name); }
当然按照常规我们最好不要也不应该有set方法,这样我们就可以保证我们的Instance始终是第一次调用的实例了……
using System;
namespace CA_StaticConstructor
{
class StaticClass
{
private static readonly StaticClass instance;
public static StaticClass Instance
{
get
{
return instance;
}
}
public string Name { get; set; }
static StaticClass()
{
instance = new StaticClass();
}
}
class Program
{
static void Main(string[] args)
{
StaticClass sc1 = StaticClass.Instance;
sc1.Name = "sc1 Instance";
Console.WriteLine(sc1.Name);
//StaticClass.Instance = null;
StaticClass sc2 = StaticClass.Instance;
//Without set Name property to Instance
Console.WriteLine(sc2.Name);
}
}
}
//Result: //sc1 Instance //sc1 Instance
相关文章推荐
- 静态构造函数(Static Constructor)(It performs well in Singleton)
- 关于静态构造函数和BeforeFieldInit
- [C#]BeforeFieldInit 与类静态构造函数
- 关于静态构造函数和BeforeFieldInit
- [C#]BeforeFieldInit与类静态构造函数
- 静态构造函数与Singleton模式在C#中的实现
- Effective Java随笔(一) 善于使用静态工厂方法代替构造函数获取实例
- Relationship between java file name and the declared class name in it
- 《Thinking in UML》读书笔记 7 : UML静态视图(用例图,类图,包图)
- 使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数。请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象
- 第三周项目1-(3)ListInsert、ListDelete、InitList、DestroyList函数
- Build a Simple Program Using Boost in(std::cin) : What does it mean?
- 调用getLoaderManager().initLoader()时出现ClassCastException的解决方式
- App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Te
- VC6.0--- Unable to register this add-in because its DllR
- 数组--->工具类的构造函数需私有化,成员方法为静态
- 黑马程序员_java静态代码块、构造代码块和构造函数的执行时间分析
- Not a life in vain, it's enough.
- 删除数据库时提示数据库正在被使用,无法删除(Cannot drop database databasename because it is currently in use)的问题
- 2007 IT salary benchmarks in Asia