C#下的单例实现

2016-02-19 13:47 0 1 收藏

今天天气好晴朗处处好风光,好天气好开始,图老师又来和大家分享啦。下面给大家推荐C#下的单例实现,希望大家看完后也有个好心情,快快行动吧!

【 tulaoshi.com - 编程语言 】

  本文介绍了C#下关于单例的三种实现方法。

  最普通的一种:

以下是引用片段:
  using System;
  public class Singleton
  {
  private static Singleton instance;
  private Singleton() {}
  public static Singleton Instance
  {
  get
  {
  if (instance == null)
  instance = new Singleton();
  return instance;
  }
  }
  }

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

  这种方案在.Net下面是线程不安全的,每个线程进来会创建不同的类型实例。

  下面是一种在.Net公共语言运行环境下的线程安全单例实现模式:

以下是引用片段:
  public sealed class Singleton
  {
  private static readonly Singleton instance = new Singleton();
  private Singleton(){}
  public static Singleton Instance
  {
  get
  {
  return instance;
  }
  }
  }

  它是依靠公共语言运行时的能力来构造的线程安全模式,在别的语言环境中是不适用的。

  基于此加上.Net对泛型的支持,我们可以做一个通用的泛型单例Provider, 代码如下:

以下是引用片段:
  public class SingletonProvider where T : new()
  {
  SingletonProvider() { }
  public static T Instance
  {
  get { return SingletonCreator.instance; }
  }
  class SingletonCreator
  {
  static SingletonCreator() { }
  internal static readonly T instance = new T();
  }
  }

  在此应用下,单例的实例由CLR保证只在首次引用它时才会被创建。

  当它不能满足需要时,比如:你需要在构造函数中做一些其它的操作完成初始化的话,那么就可以考虑使用Double-checked locking模式来实现。

  一个线线程安全的单例:

以下是引用片段:
  using System;
  public sealed class Singleton
  {
  private static volatile Singleton instance;
  private static object syncRoot = new Object();
  private Singleton() {}
  public static Singleton Instance
  {
  get
  {
  if (instance == null)
  {
  lock (syncRoot)
  {
  if (instance == null)
  instance = new Singleton();
  }
  }
  return instance;
  }
  }
  }

  需要注意的时,这里锁定的是syncRoot,而不是本身,这可以避免产生死锁。

  在其它的语言环境中,Double-Checked Locking不一定能正常工作,这是由于编译器本身的问题产生的,所以上面的实现方法并不一定适用于其它的语言环境。

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

来源:https://www.tulaoshi.com/n/20160219/1605242.html

延伸阅读
很多人都有过使用网络蚂蚁或网络快车软件下载互联网文件的经历,这些软件的使用可以大大加速互联网上文件的传输速度,减少文件传输的时间。这些软件为什么有如此大的魔力呢?其主要原因是这些软件都采用了多线程下载和断点续传技术。如果我们自己来编写一个类似这样的程序,也能够快速的在互联网上下载文件,那一定是非常愉快的事情。下面...
木马的介绍 因为本文是探讨木马程序,所以在介绍之前有一些木马构成的基本知识事先说明。一个完整的木马系统由硬件部分,软件部分和具体连接部分组成。这里主要对软件部分介绍,它主要有控制端程序、木马程序(后台服务程序)、木马配制程序组成。控制端用以远程控制服务端的程序;木马程序是潜入服务端内部,获取其操作权限的程序;...
1.先通过程序生成报表样式的HTML页面,然后修改HTML页面的后缀名为DOC。 2.定制WORD文档的模板文件,在C#中操作WORD模板,生成新的WORD文档。 第一方案简单,只需要改动文件的扩展名就行了,但是也存在了一些问题,譬如生成的WORD文档样式的丢失。这样对于客户来说可能是一个无法通过的方案。第二方案比较复杂,需要调用OFFICE的WORD组件通过C...
在.Net 中 DataGrid 虽然有排序的功能,但并不支持双向的排序。用到了,看了些相关的帖子,自己尝试了一种方法,竟然也行得通,主要是用DataGrid.Attributes 存了一个参数,同时在onSortCommand中修改了DataGridColumn的SortExpression. 代码如下: private void BindData(){ DataTable dt = .......; if(dt != null) { DataVi...
现在有很多网络管理软件都具备网络上信息实时传送的功能,虽然有些网络通讯软件功能比较强大,有的软件不仅可以传送文本信息,还可以传送二进制文件等。但它们都有一个无法克服的缺点,那就是分发比较困难,信息传送双方计算机都需要安装通讯软件的客户端和服务器端软件,并且只有但双方都打开相应软件时,才可能进行信息传送。而信使通讯...

经验教程

996

收藏

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