C#—Lazy<T> 類型(延遲初始化/懶加載模式)

C# 的 Lazy<T> 類型

Lazy<T> 是 C# 中的一個類,用于實現延遲初始化(懶加載)模式。它提供了一種線程安全的方式來延遲創建大型或資源密集型對象,直到第一次實際需要時才進行初始化。

主要特點

  1. 延遲初始化:對象只有在第一次被訪問時才會創建

  2. 線程安全:默認情況下是線程安全的,可以確保在多線程環境中只初始化一次

  3. 性能優化:避免不必要的資源消耗,特別是對于可能不會使用的資源

基本用法

// 創建一個延遲初始化的對象
Lazy<ExpensiveObject> lazyObject = new Lazy<ExpensiveObject>();// 實際訪問時才會創建對象
ExpensiveObject obj = lazyObject.Value;

構造函數選項

  1. 無參數構造函數:使用類型的默認構造函數

    Lazy<MyClass> lazy = new Lazy<MyClass>();
  2. 使用初始化函數

    Lazy<MyClass> lazy = new Lazy<MyClass>(() => new MyClass("param"));
  3. 指定線程安全模式

    // 非線程安全模式(性能更高,適用于單線程)
    Lazy<MyClass> lazy = new Lazy<MyClass>(LazyThreadSafetyMode.None);

實際應用場景

  1. 大型資源(如圖像、文件)的延遲加載

  2. 數據庫連接的延遲建立

  3. 計算密集型對象的延遲創建

  4. 依賴注入框架中的服務延遲實例化

示例

public class ExpensiveService
{public ExpensiveService(){Console.WriteLine("ExpensiveService created!");// 模擬耗時初始化Thread.Sleep(1000);}public void DoWork() => Console.WriteLine("Working...");
}class Program
{static void Main(){Lazy<ExpensiveService> lazyService = new Lazy<ExpensiveService>();Console.WriteLine("Lazy object created, but service not initialized yet");// 只有在訪問Value屬性時才會初始化lazyService.Value.DoWork();// 后續訪問不會重新初始化lazyService.Value.DoWork();}
}

輸出:

Lazy object created, but service not initialized yet
ExpensiveService created!
Working...
Working...

Lazy<T>?是優化應用程序性能和資源使用的重要工具,特別是在對象創建成本高但可能不需要的情況下。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/79878.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/79878.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/79878.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++之unordered封裝

目錄 一、哈希表的修改 1.1、哈希表節點結構 1.2、迭代器 1.3、哈希表結構 1.4、完整代碼 二、unordered_map的實現 二、unordered_set的實現 一、哈希表的修改 注意&#xff1a;這里我們使用哈希桶來封裝unordered_map和unordered_set。 1.1、哈希表節點結構 templa…

[滲透測試]滲透測試靶場docker搭建 — —全集

[滲透測試]滲透測試靶場docker搭建 — —全集 對于初學者來說&#xff0c;僅僅了解漏洞原理是不夠的&#xff0c;還需要進行實操。對于公網上的服務我們肯定不能輕易驗證某些漏洞&#xff0c;否則可能觸犯法律。這是就需要用到靶場。 本文主要給大家介紹幾種常見漏洞對應的靶場…

Docker如何更換鏡像源提高拉取速度

在國內&#xff0c;由于網絡政策和限制&#xff0c;直接訪問DockerHub速度很慢&#xff0c;尤其是在拉取大型鏡像時。為了解決這個問題&#xff0c;常用的方法就是更換鏡像源。本文將詳細介紹如何更換Docker鏡像源&#xff0c;并提供當前可用的鏡像源。 換源方法 方法1&#x…

第一篇:從哲學到管理——實踐論與矛盾論如何重塑企業思維

引言&#xff1a;當革命哲學照亮現代商業 1937年&#xff0c;毛澤東在戰火中寫就的《實踐論》《矛盾論》&#xff0c;為中國共產黨提供了認識世界的方法論。今天&#xff0c;這兩部著作正成為企業破解管理困局的“思維操作系統”&#xff1a; 戰略模糊&#xff1a;據Gartner統…

云原生--基礎篇-2--云計算概述(云計算是云原生的基礎,IaaS、PaaS和SaaS服務模型)

1、云計算概念 云計算是一種通過互聯網提供計算資源&#xff08;包括服務器、存儲、數據庫、網絡、軟件等&#xff09;和服務的技術模式。用戶無需擁有和維護物理硬件&#xff0c;而是可以根據需要租用這些資源&#xff0c;并按使用量付費。 2、云計算特點 &#xff08;1&am…

一級濾波器設計:IL_cmdm > 80dB

目錄 背景 目的 操作 仿真測試 搭建仿真模型 插入損耗測試 優化設計后重新測試 思考 背景 在選購共模電感時&#xff0c;規格書中通常會提供插損曲線或者阻抗-頻率曲線&#xff0c;但這些數據都是在特定條件下測試獲得的。如果將其集中在我們的樣機中性能會如何&#…

qt 配置 mysql 驅動問題:Cannot load library qsqlmysql;QMYSQL driver not loaded

項目場景&#xff1a; 環境版本&#xff1a; qt &#xff1a;5.14.2 mysql&#xff1a;8.0 windows&#xff1a;10 提示&#xff1a;qt 配置 mysql 驅動&#xff1a; 項目場景&#xff1a;qt 配置 mysql 驅動 問題描述 提示&#xff1a;這里描述項目中遇到的問題&#xff1a;…

Kubernetes相關的名詞解釋Container(16)

什么是Container&#xff1f; 在 Kubernetes 中&#xff0c;Container&#xff08;容器&#xff09; 是一個核心概念&#xff0c;你可以將鏡像&#xff08;Image&#xff09;類比為程序的“源代碼”&#xff0c;而容器是這段“代碼”運行時的進程。例如&#xff0c;一個 nginx…

學習設計模式《四》——單例模式

一、基礎概念 單例模式的本質【控制實例數目】&#xff1b; 單例模式的定義&#xff1a;是用來保證這個類在運行期間只會被創建一個類實例&#xff1b;單例模式還提供了一個全局唯一訪問這個類實例的訪問點&#xff08;即GetInstance方法&#xff09;單例模式只關心類實例的創建…

零基礎上手Python數據分析 (19):Matplotlib 高級圖表定制 - 精雕細琢,讓你的圖表脫穎而出!

寫在前面 —— 超越默認樣式,掌握 Matplotlib 精細控制,打造專業級可視化圖表 上一篇博客,我們學習了 Matplotlib 的基礎繪圖功能,掌握了如何繪制常見的折線圖、柱狀圖、散點圖和餅圖,并進行了基本的圖表元素定制,例如添加標題、標簽、圖例等。 這些基礎技能已經能讓我…

信奧中的數學

信奧賽的數學大綱 ps:知識點是其他小伙伴分享的&#xff0c;我現在在做一下系列視頻 會逐步更新&#xff0c;希望大家支持喜歡。 1.基礎數學 數論 整數和自然數 素數、合數和因數分解 最大公約數(GCD)和最小公倍數(LCM) 同余和取模運算 歐幾里得算法 擴展歐幾里得算法 中國…

PHP騰訊云人臉核身獲取Access Token

參考騰訊云官方文檔&#xff1a; 人臉核身 獲取 Access Token_騰訊云 public function getAccessToken(){$data [appId > , //WBappid,https://cloud.tencent.com/document/product/1007/49634secret > ,grant_type > client_credential, //授權類型version > 1…

《作用域大冒險:從閉包到內存泄漏的終極探索》

“愛自有天意&#xff0c;天有道自不會讓有情人分離” 大家好&#xff0c;關于閉包問題其實實際上是js作用域的問題&#xff0c;那么js有幾種作用域呢&#xff1f; 作用域類型關鍵字/場景作用域范圍示例全局作用域var&#xff08;無聲明&#xff09;整個程序var x 10;函數作用…

為什么Makefile中的clean需要.PHONY

原因一&#xff1a;避免Makefile檢查時間戳 前置知識&#xff1a;makefile在依賴文件沒有改變時不會執行編譯命令 #第一次執行&#xff0c;OK [rootVM-16-14-centos ~]# make g -E main.cc -o main.i g -S main.i -o main.s g -c main.s -o main.o g main.o -o main#第二…

垂直行業突圍:工業軟件在汽車、航空領域的 “破壁” 實踐

在當今科技高速發展的時代&#xff0c;工業軟件已悄然完成從通用工具到垂直行業 “戰略武器” 的蛻變。特別是在汽車與航空這兩大高端制造領域&#xff0c;工業軟件的價值早已超越單純的效率提升&#xff0c;成為關乎核心技術自主可控的關鍵要素&#xff0c;一場圍繞工業軟件的…

07.Python代碼NumPy-排序sort,argsort,lexsort

07.Python代碼NumPy-排序sort&#xff0c;argsort&#xff0c;lexsort 提示&#xff1a;幫幫志會陸續更新非常多的IT技術知識&#xff0c;希望分享的內容對您有用。本章分享的是NumPy的使用語法。前后每一小節的內容是存在的有&#xff1a;學習and理解的關聯性&#xff0c;希望…

LVDS系列8:Xilinx 7系可編程輸入延遲(一)

在解析LVDS信號時&#xff0c;十分重要的一環就是LVDS輸入信號線在經過PCB輸入到FPGA中后&#xff0c;本來該嚴格對齊的信號線會出現時延&#xff0c;所以需要在FPGA內部對其進行延時對齊后再進行解析。 Xilinx 7系器件中用于輸入信號延時的組件為IDELAYE2可編程原語&#xff0…

AI驅動研發效率在中后臺的實踐

本文探討了AI驅動的中后臺前端研發實踐&#xff0c; 涵蓋設計出碼、接口定義轉換、代碼擬合、自動化測試等多個環節&#xff0c;通過具體案例展示了AI技術如何優化研發流程并提升效率。特別是在UI代碼編寫和接口聯調階段&#xff0c;并提出了設計出碼&#xff08;Design to Cod…

【Rust 精進之路之第6篇-流程之舞】控制流:`if/else`, `loop`, `while`, `for` 與模式匹配初窺

系列: Rust 精進之路:構建可靠、高效軟件的底層邏輯 作者: 碼覺客 發布日期: 2025-04-20 引言:讓代碼“活”起來——指令的流動 在前面的文章中,我們已經掌握了 Rust 的基礎數據類型(標量和復合類型)以及如何通過變量綁定來存儲和命名它們。這相當于我們準備好了程序…

C++ 表達式求值的基礎(四十九)

1. 運算符的分類 1.1 按操作數個數 一元運算符&#xff08;Unary&#xff09; 作用于單個操作數&#xff1a; 取地址 &obj解引用 *ptr邏輯非 !b一元加減 x, -x遞增遞減 i, i-- 二元運算符&#xff08;Binary&#xff09; 作用于兩個操作數&#xff1a; 算術運算 a b, a …