|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
如果需要重新编写代码,几乎任何一门计算机语言都可以跨平台了,还用得着Java嘛,而且像PHP/C#等语言不需要修改代码都可以跨Windows/Linux。 先容
良多有着分歧开辟背景得人城市对照熟习单例形式。他们会发明每次他们要创立一个分歧的单例类的时分,都不能不写一样得代码。利用新的C#2.0的泛型,能够完成只写一次一样得代码。
利用C#2.0泛型来完成单例形式的重用
利用C#2.0的泛型,使得完成我所说的"单例供应者"成为大概。这是一个可用来创立单例类实例确不必要为每一个特定的类重写单例形式代码的可重用的类。如许分别出单例布局的代码,将有益于坚持按单例形式利用类或不按单例形式利用类的天真性。
publicsealedclassSingleton
{
Singleton()
{}
publicstaticSingletonInstance
{
get
{
returnSingletonCreator.instance;
}
}
classSingletonCreator
{
//ExplicitstaticconstructortotellC#compiler
//nottomarktypeasbeforefieldinit
staticNested()
{}
internalstaticreadonlySingletoninstance=newSingleton();
}
}
基于对泛型的懂得,你能够发明没有来由不在这段代码里交换范例参数为泛型里典范的T。假如如许做,这段代码就酿成上面如许。
publicclassSingletonProvider<T>whereT:new()
{
SingletonProvider(){}
publicstaticTInstance
{
get{returnSingletonCreator.instance;}
}
classSingletonCreator
{
staticSingletonCreator(){}
internalstaticreadonlyTinstance=newT();
}
}
注重在这里利用了泛型的束缚。这个束缚强迫任何范例T都必需具有没有参数的大众机关函数。这里同意singletonCreator类来实例化范例T。
那末,要怎样来利用单例供应者呢?为了弄扫除怎样利用它,我们必要写一个测试类。这个测试类有两个部分。第一部分是一个默许的机关函数,用来设置timestamp变量的值。第二部分是一个大众函数,用来完成用"Debug.WriteLine"来输入timestamp的值。这个测试类的意义就是不管谁人线程在任什么时候候,在单例下挪用这个类大众办法,都将前往不异的值。
publicclassTestClass
{
privatestring_createdTimestamp;
publicTestClass()
{
_createdTimestamp=DateTime.Now.ToString();
}
publicvoidWrite()
{
Debug.WriteLine(_createdTimestamp);
}
}
这个类就像上面如许利用单例供应者:
SingletonProvider<TestClass>.Instance.Write();
存眷点
我已在一个超线程的双处置器上利用100个线程在单态形式下举行了测试。一切线程都前往不异的值,这申明这是一个线程平安的利用泛型来完成的单态形式。我信任这已充实申明了泛型怎样匡助你简化代码。C#中有两处地方用到new关键字,第一处也是最常见的一处是用在调用构造函数的时候,这种情况也是大家见的最多的一种。另一处是用在派生类中,作用有隐藏成员,切断继承关系等,相信第二处的用法大家明显要比第一处生疏。 |
|