C# 创建单例你会几种方式?

简介: 关于为什么需要创建单例?这里不过多介绍,具体百度知。 关于C# 创建单例步骤或条件吧 1、声明静态变量;2、私有构造函数(无法实例化)3、静态创建实例的方法;至于我这里的Singleton是sealed ,只是为了防止被继承,其实有私有构造函数足够了,这里只是为了代码可读性。

关于为什么需要创建单例?这里不过多介绍,具体百度知。

关于C# 创建单例步骤或条件吧

1、声明静态变量;2、私有构造函数(无法实例化)3、静态创建实例的方法;至于我这里的Singleton是sealed ,只是为了防止被继承,其实有私有构造函数足够了,这里只是为了代码可读性。

第一种常见的方式创建单例:

    /// 不安全的单例
    /// </summary>
    public sealed class Singleton
    {
        private static Singleton _Singleton;
        private Singleton() { }
        public static Singleton GetSingleton()
        {
            if (_Singleton == null)
            {
                _Singleton = new Singleton();
            }
            return _Singleton;
        }
    }

注:为什么说是不安全的单例,多线程访问时可能会new多个对象...

第二种方式创建单例:

    /// (多线程)安全单例
    /// </summary>
    public sealed class Singleton
    {
        private static Singleton _Singleton;
        private static readonly object obj = new object();
        private Singleton() { }
        public static Singleton GetSingleton()
        {
            if (_Singleton == null)
            {
                //加锁保护,在多线程下可以确保实例值被创建一次。缺点是每 次获取单例,都要进行判断,涉及到的锁和解锁比较耗资源。
                lock (obj)
                {
                    if (_Singleton == null)
                    {
                        _Singleton = new Singleton();
                    }
                }

            }
            return _Singleton;
        }
    }

注:为了解决上面第一种方式创建的不安全实例问题应用而生。

第三种方式创建单例:

    /// 只读单例
    /// </summary>
    public sealed class Singleton
    {
        private static readonly Singleton instance = new Singleton();
        private Singleton() { }
        public static Singleton Instance
        {
            get
            {
                return instance;
            }
        }
    }
    /// 基于上面的只读单例=自动属性只读单例(语法糖)
    /// </summary>
    public sealed class Singleton
    {
        private Singleton() { }
        public static Singleton Instance { get; } = new Singleton();
    }

注:只读属性式=>借助readonly属性,instance只被初始化一次,同样达到了单例的效果。在引用函数执行第一句话之前,instance其实已经被赋值了,并不是预期的 只有到访问Instance变量时才创建对象。

第四种方式创建单例:

    /// Singleton中加上静态构造函数。
    /// </summary>
    public sealed class Singleton
    {
        public static readonly Singleton instance = new Singleton();
        private Singleton()
        {
            Console.WriteLine("初始化1!");
        }
        static Singleton()
        {
        }
        public static Singleton Instance
        {
            get { return instance; }
        }
    }

注:为了解决(第三种只读属性实例)在执行第一句代码之前,实例已经被初始化问题。

第五种方式创建单例:

    /// 使用Lazy创建单例,默认是线程安全的
    /// </summary>
    public sealed class Singleton
    {
        private static readonly Lazy<Singleton> instance = new Lazy<Singleton>(() => new Singleton());//
        private Singleton() { }
        public static Singleton Instance
        {
            get
            {
                return instance.Value;
            }
        }
    }
        // 摘要:
        //    初始化System.Lazy`1类的新实例。 懒惰初始化时
        //    发生时,使用指定的初始化函数和初始化模式。
     
        // 参数:
        //   valueFactory:
        //   被调用以生成延迟初始化值的委托是必需的参数
        //
        //   isThreadSafe:
        //     如果要使此实例可由多个线程同时使用,则为true; false
         //使此实例一次只能由一个线程使用。
        public Lazy(Func<T> valueFactory, bool isThreadSafe);
相关文章
C#单例的多种写法
单例的细分写法 本文提供全流程,中文翻译。Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例) 1 最...
1459 0
|
1月前
|
C#
24. C# 编程:用户设定敌人初始血值的实现
24. C# 编程:用户设定敌人初始血值的实现
19 0
|
2月前
|
SQL 数据库连接 应用服务中间件
C#WinForm基础编程(三)
C#WinForm基础编程
73 0
|
2月前
C#WinForm基础编程(二)
C#WinForm基础编程
55 0
|
2月前
|
C# 数据安全/隐私保护
C#WinForm基础编程(一)
C#WinForm基础编程
60 0
|
4月前
|
数据采集 前端开发 C#
C#编程艺术:Fizzler库助您高效爬取www.twitter.com音频
Twitter是全球最大的社交媒体平台之一,包含丰富的音频资源。用户可以在Twitter上发布、转发、评论和收听各种音频内容,如音乐、播客、新闻、故事等,直接从Twitter抓取音频数据并非易事,尤其是在考虑到可能的封锁和反爬虫机制。Twitter会对频繁访问的IP地址进行限制或封禁,以防止恶意爬虫的行为。因此,我们需要使用一些技术手段来规避这些障碍,确保稳定而高效的数据访问。
C#编程艺术:Fizzler库助您高效爬取www.twitter.com音频
|
3月前
|
程序员 C#
深入理解 C# 编程:枚举、文件处理、异常处理和数字相加
枚举是一个特殊的“类”,表示一组常量(不可更改/只读变量)。 要创建枚举,请使用 enum 关键字(而不是 class 或 interface),并用逗号分隔枚举项:
38 0
|
2天前
|
存储 安全 网络安全
C#编程的安全性与加密技术
【4月更文挑战第21天】C#在.NET框架支持下,以其面向对象和高级特性成为安全软件开发的利器。本文探讨C#在安全加密领域的应用,包括使用System.Security.Cryptography库实现加密算法,利用SSL/TLS保障网络传输安全,进行身份验证,并强调编写安全代码的重要性。实际案例涵盖在线支付、企业应用和文件加密,展示了C#在应对安全挑战的同时,不断拓展其在该领域的潜力和未来前景。
|
2天前
|
程序员 C#
C#编程中的面向对象编程思想
【4月更文挑战第21天】本文探讨了C#中的面向对象编程,包括类、对象、封装、继承和多态。类是对象的抽象,定义属性和行为;对象是类的实例。封装隐藏内部细节,只暴露必要接口。继承允许类复用和扩展属性与行为,而多态使不同类的对象能通过相同接口调用方法。C#通过访问修饰符实现封装,使用虚方法和抽象方法实现多态。理解并应用这些概念,能提升代码的清晰度和可扩展性,助你成为更好的C#程序员。
|
3天前
|
IDE 程序员 C#
C#编程入门:从零开始的旅程
【4月更文挑战第20天】本文引导初学者入门C#编程,从环境搭建开始,推荐使用Visual Studio Community版作为IDE。接着,通过编写&quot;Hello, World!&quot;程序,介绍基本语法,包括数据类型、运算符和表达式。文章还涉及控制结构、函数和方法,以及面向对象编程概念。通过学习,读者将对C#有初步了解,并激发进一步探索编程世界的兴趣。