请问关于c的具体应用场景有哪些?

2026-05-17 16:058阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1156个文字,预计阅读时间需要5分钟。

请问关于c的具体应用场景有哪些?

记录学习单例模式实例的笔记:

单例模式实例要求:- 单例即确保一个类只有一个实例。- 外部不能使用new创建实例。- 需要全局访问点,每次获取实例。

实现完全封闭的单例(外部不能new)需要:- 全局访问点:需要一个全局变量来存储实例。- 静态变量:确保该变量是全局静态的,只能被类内部访问。

例如:pythonclass Singleton: _instance=None

def __new__(cls): if cls._instance is None: cls._instance=super(Singleton, cls).__new__(cls) return cls._instance每次调用`Singleton()`时,都会返回同一个实例。

  记一下学习单例模式的笔记:

  单例就是要保证该类仅有一个实例。实现完全封闭的单例(外部不能new)其实就要两点要求:

  • 全局访问:需要一个该类型的全局静态变量,每次获取实例时都要判断它是否null,不存在new,存在通过一个方法直接返回该值获取实例来保证对象唯一;
  • 实例化控制:new实例不能外部new、造成实例不唯一,需要一个私有构造器禁用共有构造器。

  根据new实例的时机,分为饿汉式和懒汉式:

一、 饿汉式单例:静态变量初始化时new

  特点:加载时new,一开始全局就存在该唯一实例,每次用到只要获取就行,提前占用系统资源但不存在线程安全问题。代码如下:

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

二、 懒汉式单例:需要该实例的时候再new

  特点:真正需要用到的时候才实例化,不提前占用资源但多个线程同时用到该实例时,会存在判断静态变量都为null都去new而产生多个实例的情况。有线程安全问题,但可以用双重锁定解决。

  单线程懒汉单例代码如下:

public class Singleton { private static Singleton instance = null; private Singleton() { } public static Singleton GetInstance() { if (instance == null) instance = new Singleton(); return instance; } }

  多线程懒汉单例代码如下:

public class Singleton { private static Singleton instance = null; private static readonly object obj = new object(); private Singleton() { } public static Singleton GetInstance() { //双重锁定 if (instance == null)//只有为null需要实例化处理时才进行加锁,提高性能避免不必要的等待 { lock (obj) { if (instance == null)//避免其他线程等待锁释放期间有线程已经实例化,从而造成多个实例 instance = new Singleton(); } } return instance; } }

三、 注册式单例

  介绍一个有意思的单例-泛型注册式,是对单例的扩展,主要了解它的设计思想。

  其实每个类单例模式实现代码都是差不多的:

  1. 相同结构和成员(字段、属性、行为等):是否可以考虑进行抽象提取一个公共的调用接口?
  2. 成员类型或输入输出具体类型不是固定的:是否可以考虑设计一个适用于不同类型的通用处理方式而不都是Object?这个适用不同类型通用解决就要用到泛型。

  实现代码如下(例子使用饿汉式,当然也可以用懒汉式):

public abstract class Singleton<T> where T:class,new() { private static readonly T instance = new T(); protected Singleton() { } public static T GetSingleton()//获取单例 { return instance; } } public class Person : Singleton<Person> { }

  可以看到这种单例通过继承的方式,既可以new实例也可以获取单例实例。如果要实现上面的完全封闭(禁用外部new),也可以完全在Person类中写个私有构造器在Singleton<T>类中实例的获取new T()改为反射调用私有构造器的方式实现,总感觉怪怪的。

  下面是主程序调用该单例方法:

static void Main(string[] args) { Person p1 = Person.GetSingleton(); Person p2 = Singleton<Person>.GetSingleton(); if (object.ReferenceEquals(p1, p2)) { Console.WriteLine("两个对象是同一实例"); } Console.ReadKey(); }

  输出结果:

请问关于c的具体应用场景有哪些?

以上就是c# 单例模式的实现方法的详细内容,更多关于c# 单例模式的资料请关注自由互联其它相关文章!

本文共计1156个文字,预计阅读时间需要5分钟。

请问关于c的具体应用场景有哪些?

记录学习单例模式实例的笔记:

单例模式实例要求:- 单例即确保一个类只有一个实例。- 外部不能使用new创建实例。- 需要全局访问点,每次获取实例。

实现完全封闭的单例(外部不能new)需要:- 全局访问点:需要一个全局变量来存储实例。- 静态变量:确保该变量是全局静态的,只能被类内部访问。

例如:pythonclass Singleton: _instance=None

def __new__(cls): if cls._instance is None: cls._instance=super(Singleton, cls).__new__(cls) return cls._instance每次调用`Singleton()`时,都会返回同一个实例。

  记一下学习单例模式的笔记:

  单例就是要保证该类仅有一个实例。实现完全封闭的单例(外部不能new)其实就要两点要求:

  • 全局访问:需要一个该类型的全局静态变量,每次获取实例时都要判断它是否null,不存在new,存在通过一个方法直接返回该值获取实例来保证对象唯一;
  • 实例化控制:new实例不能外部new、造成实例不唯一,需要一个私有构造器禁用共有构造器。

  根据new实例的时机,分为饿汉式和懒汉式:

一、 饿汉式单例:静态变量初始化时new

  特点:加载时new,一开始全局就存在该唯一实例,每次用到只要获取就行,提前占用系统资源但不存在线程安全问题。代码如下:

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

二、 懒汉式单例:需要该实例的时候再new

  特点:真正需要用到的时候才实例化,不提前占用资源但多个线程同时用到该实例时,会存在判断静态变量都为null都去new而产生多个实例的情况。有线程安全问题,但可以用双重锁定解决。

  单线程懒汉单例代码如下:

public class Singleton { private static Singleton instance = null; private Singleton() { } public static Singleton GetInstance() { if (instance == null) instance = new Singleton(); return instance; } }

  多线程懒汉单例代码如下:

public class Singleton { private static Singleton instance = null; private static readonly object obj = new object(); private Singleton() { } public static Singleton GetInstance() { //双重锁定 if (instance == null)//只有为null需要实例化处理时才进行加锁,提高性能避免不必要的等待 { lock (obj) { if (instance == null)//避免其他线程等待锁释放期间有线程已经实例化,从而造成多个实例 instance = new Singleton(); } } return instance; } }

三、 注册式单例

  介绍一个有意思的单例-泛型注册式,是对单例的扩展,主要了解它的设计思想。

  其实每个类单例模式实现代码都是差不多的:

  1. 相同结构和成员(字段、属性、行为等):是否可以考虑进行抽象提取一个公共的调用接口?
  2. 成员类型或输入输出具体类型不是固定的:是否可以考虑设计一个适用于不同类型的通用处理方式而不都是Object?这个适用不同类型通用解决就要用到泛型。

  实现代码如下(例子使用饿汉式,当然也可以用懒汉式):

public abstract class Singleton<T> where T:class,new() { private static readonly T instance = new T(); protected Singleton() { } public static T GetSingleton()//获取单例 { return instance; } } public class Person : Singleton<Person> { }

  可以看到这种单例通过继承的方式,既可以new实例也可以获取单例实例。如果要实现上面的完全封闭(禁用外部new),也可以完全在Person类中写个私有构造器在Singleton<T>类中实例的获取new T()改为反射调用私有构造器的方式实现,总感觉怪怪的。

  下面是主程序调用该单例方法:

static void Main(string[] args) { Person p1 = Person.GetSingleton(); Person p2 = Singleton<Person>.GetSingleton(); if (object.ReferenceEquals(p1, p2)) { Console.WriteLine("两个对象是同一实例"); } Console.ReadKey(); }

  输出结果:

请问关于c的具体应用场景有哪些?

以上就是c# 单例模式的实现方法的详细内容,更多关于c# 单例模式的资料请关注自由互联其它相关文章!