使用C# 2.0泛型实现单例模式重用

2016-02-19 15:23 8 1 收藏

今天给大家分享的是由图老师小编精心为您推荐的使用C# 2.0泛型实现单例模式重用,喜欢的朋友可以分享一下,也算是给小编一份支持,大家都不容易啊!

【 tulaoshi.com - 编程语言 】

  介绍

  很多有着不同开发背景得人都会比较熟悉单例模式。他们会发现每次他们要创建一个不同的单例类的时候,都不得不写同样得代码。使用新的C# 2.0的泛型,可以实现只写一次同样得代码。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  使用 C# 2.0 泛型来完成单例模式的重用

  使用 C# 2.0 的泛型,使得实现我所说的"单例提供者"成为可能。这是一个可用来创建单例类实例确不需要为每个特定的类重写单例模式代码的可重用的类。这样分离出单例结构的代码,将有利于保持按单例模式使用类或不按单例模式使用类的灵活性。

  

public sealed class Singleton{ Singleton() {} public static Singleton Instance {  get  {   return SingletonCreator.instance;  } } class SingletonCreator {  // Explicit static constructor to tell C# compiler  // not to mark type as beforefieldinit  static Nested()  {}  internal static readonly Singleton instance = new Singleton(); }}

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  基于对泛型的了解,你可以发现没有理由不在这段代码里替换类型参数为泛型里典型的'T'。如果这样做,这段代码就变成下面这样。

  

public class SingletonProviderT where T : new(){ SingletonProvider() { } public static T Instance {  get { return SingletonCreator.instance; } } class SingletonCreator {  static SingletonCreator() { }  internal static readonly T instance = new T(); }}

  注意在这里使用了泛型的约束。这个约束强制任何类型'T'都必须具有无参数的公共构造函数。这里允许singletonCreator类来实例化类型'T'。

  那么,要怎么样来使用单例提供者呢?为了弄清除如何使用它,我们需要写一个测试类。这个测试类有两个部分。第一部分是一个默认的构造函数,用来设置timestamp变量的值。第二部分是一个公共函数,用来实现用"Debug.WriteLine"来输出timestamp的值。这个测试类的意思就是不论那个线程在任何时候,在单例下调用这个类公共方法,都将返回相同的值。

  

public class TestClass{ private string _createdTimestamp; public TestClass () {  _createdTimestamp = DateTime.Now.ToString(); } public void Write() {  Debug.WriteLine(_createdTimestamp); }}

  这个类就像下面这样使用单例提供者:

  

SingletonProviderTestClass.Instance.Write();

  关注点

  我已经在一个超线程的双处理器上使用100个线程在单态模式下进行了测试。所有线程都返回相同的值,这说明这是一个线程安全的使用泛型来实现的单态模式。 我相信这已经充分说明了泛型怎么帮助你简化代码。

来源:http://www.tulaoshi.com/n/20160219/1609546.html

延伸阅读
对于new()约束,大家可能有一个误解,以为使用了new约束之后,在创建对象时与非泛型的版本是一致的: public class Tester where T:new() { public Tester() { t = new T();//等同于非泛型版本的new? 例如 object o = new object();? } private T t; } 事实上,使用new关键字的作用只是让编译器在泛型实例化之处,检查所绑定的泛型参...
很多人第一次接触到DirectX大都是通过游戏,至于安装、升级DirectX的原因无非是满足游戏运行的需要。Direct X其实是微软公司推出的一个为Windows平台的多媒体API函数库,它提供标准接口来与显卡和声卡、输入设备等进行交互。如果没有这组标准API函数库,那你就需要为每一种显卡、声卡的每个组合和每种类型的键盘、鼠标和游戏杆编写不同的代...
using System;using System.DirectoryServices; //要增加此DLL文件 private void button3_Click(object sender, System.EventArgs e) { try { DirectoryEntry AD = new DirectoryEntry("WinNT://" + Environment.MachineName + ",computer"); DirectoryEntry NewUser = AD.Children.Add("TestUser1", "use...
推荐: Visual C# 轻松入门全攻略 匿名方法基础 匿名方法是C#2.0的一个新的语言特性。本文的主要内容是提供给读者关于匿名方法的内部实现和工作方式的一个更好的理解。本文无意于成为匿名方法的完全语言特性参考。 匿名方法允许我们定义委托对象可以接受的代码块。这个功能省去我们创建委托时想要传递给一个...
在前两篇文章中我们讨论了XML文件的读取和写入,但都是基于流模型的解决方案,今天我们就来谈谈在C#中如何实现DOM,DOM确实有它的不足,但在编程工作中它还是不可或缺的技术。下面我们来简单了解一下DOM的相关知识。 DOM的全称是Document Object Model(文档对象模型),它是来自W3C的官方标准,它允许按照W3C标准W3C DOM Level1和W3C...

经验教程

272

收藏

49
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部