》》》Lazy 不存在高并发问题,lazy已经解决了。
CLR 类执行的顺序
- 静态变量初始化 1次
- 静态构造函数 1次
- 实例变量初始化
- 基类静态变量初始化 1次
- 基类静态构造函数 1次
- 基类实例变量初始化
- 基类实例构造函数
- 实例构造函数
》》》 创建单例模式 好多种
1,静态类 方法 (静态类不能实现接口,不能继承,也不能被继承,不能有虚方法,抽象方法 静态类必须在第一次加载时初始化,如果项目中用不到会导致资源浪费;)
2、静态属性、静态变量
3、lock
lazy<T>
Lazy< T> 利用了 C# 的属性器和反射机制来实现延迟加载。当访问 Lazy< T> 的 Value 属性时,如果内部值尚未初始化,则初始化它。这个过程称为“lazy initialization”。Lazy< T> 提供了几种不同的线程安全模式,以适应不同的场景。
publicclassContainer:IContainer{publicstaticIContainerDefault{get;set;}=newLazy<Container>(),Value;}Lazy 内部使用了一个委托,该委托负责创建目标对象。
当你第一次访问Lazy的Value属性时,
该委托会执行,实例化目标对象,并将其保存下来。随后的访问会直接返回已经创建好的对象,而不会再次执行委托。
Lazy<MyClass>lazyInstance=newLazy<MyClass>(()=>newMyClass());//简写 Lazy<MyClass> lazyInstance = new Lazy<MyClass>();MyClassmyObject=lazyInstance.Value;// 对象在第一次访问时创建
参考
参考
## lazy<T>基本用法 Lazy<T> 最基本的用法是,让 T 类型的无参构造函数来负责对象的创建// 假设这是一个创建开销很大的类publicclassBigResource{publicBigResource(){Console.WriteLine("BigResource 正在被创建...");// 模拟耗时操作,比如加载大量数据}publicvoidDoWork()=>Console.WriteLine("资源正在执行工作");}classProgram{staticvoidMain(){// 1. 创建 Lazy 容器,此时 BigResource 的实例并未真正创建Lazy<BigResource>lazyResource=newLazy<BigResource>();Console.WriteLine($"资源是否已创建?{lazyResource.IsValueCreated}");// 输出: False// 2. 首次访问 Value 属性,触发 BigResource 的构造函数Console.WriteLine("准备使用资源...");lazyResource.Value.DoWork();// 控制台输出:// 准备使用资源...// BigResource 正在被创建...// 资源正在执行工作// 3. 再次访问,直接使用已创建好的实例,不会再次初始化Console.WriteLine($"资源是否已创建?{lazyResource.IsValueCreated}");// 输出: TruelazyResource.Value.DoWork();// 控制台输出:// 资源正在执行工作}}### 高级用法:自定义初始化逻辑 如果对象的创建不是简单地调用无参构造函数,你可以通过委托来指定初始化逻辑// 假设这个类需要一个 id 来初始化publicclassDatabaseConnection{privatestring_connectionString;publicDatabaseConnection(stringconnectionString){_connectionString=connectionString;Console.WriteLine($"数据库连接已建立:{_connectionString}");}publicvoidQuery()=>Console.WriteLine("执行数据库查询...");}// 在程序中使用stringconfig="Server=localhost;Database=MyDB;";Lazy<DatabaseConnection>lazyDb=newLazy<DatabaseConnection>(()=>{// 这里的逻辑只有在第一次访问 .Value 时才会执行Console.WriteLine("正在根据配置创建数据库连接...");returnnewDatabaseConnection(config);});// 此时数据库连接还未建立lazyDb.Value.Query();// 输出:// 正在根据配置创建数据库连接...// 数据库连接已建立: Server=localhost;Database=MyDB;// 执行数据库查询...