C#中单例模式的三种写法示例

下面我将详细讲解C#中单例模式的三种写法示例。

一、什么是单例模式?

在软件开发中,单例模式是指保证一个类仅有一个实例,并提供一个访问它的全局访问点。

在C#中,实现单例模式有多种写法,下面我将分别介绍三种常用的方法。

二、第一种写法:简单写法

下面是使用静态变量实现简单单例模式的代码:

public sealed class Singleton
{
    private static Singleton instance = null;

    private Singleton()
    {
        // 防止外部创建实例
    }

    public static Singleton Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new Singleton();
            }
            return instance;
        }
    }
}

在以上代码中,Singleton类是采用了私有构造函数和静态变量的形式来实现单例模式的。私有构造函数可以确保在类外部无法创建实例,而静态变量则记录了类中唯一的实例。通过公共的静态属性Instance,外部程序可以访问该实例。

三、第二种写法:线程安全的写法

以上代码中的写法是最基本的实现单例模式的方法,但在多线程环境下会存在问题。如果有多个线程同时访问Instance属性,就会出现同步问题。

下面是线程安全的写法:

public sealed class Singleton {
    private static readonly Singleton instance = new Singleton();

    private Singleton() { }

    public static Singleton Instance
    {
        get
        {
            return instance;
        }
    }
}

在上面这段代码中,Singleton类采用了静态变量和私有构造函数的方式实现单例模式。与之前不同的是,在这个例子中创建唯一实例对象的时候使用了静态构造函数的方式。这种方式是自动的,并且是线程安全的。

四、第三种写法:使用Lazy类型

在上述两种实现方式中,延迟实例化需要通过调用 Instance 属性时来实现。Singleton 实例的创建被推迟了,直到我们调用 Instance 属性。同时,实例必须在第一次使用前创建,因为它一开始就是静态的。在多线程环境中,如果两个线程同时调用 Instance 属性,则有可能会创建两个实例。

为了解决这个问题,可以使用Lazy类型改写实例的创建方式。下面是这种写法的示例代码:

public class Singleton
{
    private static readonly Lazy<Singleton> lazyInstance =
        new Lazy<Singleton>(() => new Singleton());

    public static Singleton Instance { get { return lazyInstance.Value; } }

    private Singleton()
    {
    }
}

Lazy 类在实现中使用了一个构造函数,该构造函数接受一个 Delegate 类型的参数,该参数指向一个方法,该方法负责创建单例实例。这种方式相较于第一种方式和第二种方式在线程安全性上更加完善,起到了良好的保护作用。

五、总结

以上就是C#中实现单例模式的三种写法。其中第一种是最基本的实现方式,第二种是在多线程环境下保证安全的实现方式,第三种使用Lazy类型更加简单和自动化。开发者可以根据自己的实际需求来选择适合自己的实现方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#中单例模式的三种写法示例 - Python技术站

(0)
上一篇 2023年6月7日
下一篇 2023年6月7日

相关文章

  • 基于C#实现宿舍管理系统

    基于C#实现宿舍管理系统攻略 一、项目概述 宿舍管理系统是一款致力于方便学生和宿管管理宿舍日常事务的软件。本项目基于C#语言开发,使用Visual Studio集成开发环境,采用MVC架构,使用SQL Server数据库,提供了较为完整的宿舍管理功能。 二、项目特点 支持多用户登录、身份验证、权限管理等功能,保证系统安全性。 提供完善的宿舍信息录入、查询、修…

    C# 2023年5月31日
    00
  • SharePoint 客户端对象模型 (一) ECMA Script

    下面是关于“SharePoint客户端对象模型(一)ECMAScript”的完整攻略,包含两个示例。 1. SharePoint客户端对象模型简介 SharePoint客户端对象模型(CSOM)是一组API,用于在客户端应用程序中与SharePoint进行交互。CSOM提供了一组类和方法,用于执行各种操作,例如读取和写入列表数据、创建和删除网站等。 2. 使…

    C# 2023年5月15日
    00
  • C#异常处理中try和catch语句及finally语句的用法示例

    以下是“C#异常处理中try和catch语句及finally语句的用法示例”的完整攻略。 1. try和catch语句的用法示例 C#中的try和catch语句用于处理可能出现的异常。当程序执行try语句块时发生异常,程序会立即转到catch语句块,并执行catch语句块的代码。下面是一个try和catch语句的示例: try { int x = 10, y…

    C# 2023年5月15日
    00
  • C# using()的使用方法

    当我们在编写C#程序时,可能需要使用一些资源(如文件、数据库连接等),但这些资源的使用完毕后需要及时释放,来避免不必要的资源浪费和错误发生。使用using语句可以帮助我们自动释放资源,节省代码行数和提高程序的可读性。 1.基本语法 我们可以使用using语句将所需要的资源封装在一个区块中,当代码执行到该区块外时,资源会自动释放。 using(resource…

    C# 2023年5月31日
    00
  • C#逐行读取txt文件的方法

    当我们需要读取文本文件内容时,可以使用C#内置的System.IO命名空间中的StreamReader类。 以下是逐行读取txt文件并输出内容的代码示例: using System.IO; // 读取文件路径 string filePath = "example.txt"; // 判断文件是否存在 if (File.Exists(file…

    C# 2023年6月1日
    00
  • C#指针变量与unsafe的实现

    关于C#指针变量与unsafe的实现,可以按照以下步骤进行操作: 1. 允许使用指针 C#编译器默认禁止使用指针,需要手动在代码文件中加入unsafe关键字来允许使用指针。示例代码: unsafe { // 能够使用指针的代码块 } 2. 声明指针变量 在C#中,使用*运算符可以声明一个指向某种类型的指针变量。例如: int n = 10; int* p =…

    C# 2023年6月7日
    00
  • AspNetCore中的中间件详解

    AspNetCore中的中间件详解 在ASP.NET Core中,中间件是一种处理HTTP请求和响应的机制。中间件可以在请求到达应用程序之前或之后执行操作,例如记录请求、验证身份、压缩响应等。在本文中,我们将详细讲解ASP.NET Core中的中间件,包括中间件的概念、使用方法和示例。 中间件的概念 中间件是一种处理HTTP请求和响应的机制。在ASP.NET…

    C# 2023年5月16日
    00
  • CommunityToolkit.Mvvm8.1 viewmodel使用-旧式写法(2)

      本系列文章导航 https://www.cnblogs.com/aierong/p/17300066.html https://github.com/aierong/WpfDemo (自我Demo地址)     0.说明 CommunityToolkit.Mvvm8.1有一个重大更新的功能:源生成器功能,它极大简化我们的mvvm代码 但是本篇先总结一下原…

    C# 2023年4月18日
    00
合作推广
合作推广
分享本页
返回顶部