<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          如何使用 C# 中的 Lazy

          共 3594字,需瀏覽 8分鐘

           ·

          2020-12-19 13:20


          延遲初始化?是一種將對(duì)象的創(chuàng)建延遲到第一次需要用時(shí)的技術(shù),換句話說,對(duì)象的初始化是發(fā)生在真正需要的時(shí)候才執(zhí)行,值得注意的是,術(shù)語?延遲初始化?和?延遲實(shí)例化?的意思是相同的——可以互換使用,通過使用?延遲初始化?技術(shù),可以避免應(yīng)用程序不必要的計(jì)算和內(nèi)存消耗,這篇文章我們將會(huì)討論如何在 C# 中使用 延遲初始化。

          有些朋友聽完這些可能會(huì)懵逼,接下來用一個(gè)簡(jiǎn)單的例子來了解下?延遲加載?的場(chǎng)景,考慮下面兩個(gè)類,?Customer?和?Order, Customer 類包含了一個(gè) Orders 屬性,一個(gè)人肯定會(huì)有很多的訂單,也就意味著它可能包含了很多的數(shù)據(jù),甚至還需要連接數(shù)據(jù)庫(kù)去獲取 Orders 記錄,在這種場(chǎng)景下,沒必要給 customer 集合中的所有人都帶上完整的 orders,這個(gè)初始化開銷是巨大的,優(yōu)化點(diǎn)就是不加載 Orders,直到某些 customer 真的需要 Orders 時(shí)才按需灌入。

          使用 Lazy

          你可以自己寫一段邏輯來實(shí)現(xiàn)?延遲初始化,在?.Net Framework 4.0?之后就沒必要了, 因?yàn)樵?System?命名空間下已經(jīng)提供了?Lazy,而且還是?線程安全?的,可以使用這個(gè)類來延遲 資源密集型 的對(duì)象按需創(chuàng)建。

          當(dāng)使用?Lazy?的時(shí)候,這里的 T 就是你要延遲的集合,那如何做到按需加載呢?調(diào)用?Lazy.Value?即可,下面的代碼片段展示了如何使用?Lazy


          Lazy>?orders?=?new?Lazy>();
          IEnumerable?result?=?lazyOrders.Value;

          現(xiàn)在,考慮下面的兩個(gè)類:?Author?和?Blog,一個(gè)作者可以寫很多文章,所以這兩個(gè)類之間是?一對(duì)多?的關(guān)系,下面的代碼片段展示了這種關(guān)系。


          ????public?class?Author
          ????{
          ????????public?int?Id?{?get;?set;?}
          ????????public?string?FirstName?{?get;?set;?}
          ????????public?string?LastName?{?get;?set;?}
          ????????public?string?Address?{?get;?set;?}
          ????????public?List?Blogs?{?get;?set;?}
          ????}
          ????public?class?Blog
          ????{
          ????????public?int?Id?{?get;?set;?}
          ????????public?string?Title?{?get;?set;?}
          ????????public?DateTime?PublicationDate?{?get;?set;?}
          ????}

          值得注意的是,關(guān)系型數(shù)據(jù)庫(kù)中的?一對(duì)多?關(guān)系映射到對(duì)象模型就是?Author?類中增加一個(gè) List Blogs 屬性,使用這個(gè)屬性,Author 就可以維持一個(gè)或者多個(gè) Blog 實(shí)例對(duì)象,對(duì)吧。

          現(xiàn)在假定在?用戶界面?上僅需展示 Author 的基礎(chǔ)信息,比如說:(firstname,lastname,address),在這種場(chǎng)景下,給 Author 對(duì)象加載 Blogs 集合是毫無意義的,當(dāng)真的需要加載 Blogs 時(shí),執(zhí)行 Blogs.Value 即可立即執(zhí)行,下面展示了?Lazy Blogs?的用法。


          ????public?class?Author
          ????{
          ????????public?int?Id?{?get;?set;?}
          ????????public?string?FirstName?{?get;?set;?}
          ????????public?string?LastName?{?get;?set;?}
          ????????public?string?Address?{?get;?set;?}
          ????????public?Lazy>?Blogs?=>?new?Lazy>(()?=>?GetBlogDetailsForAuthor(this.Id));
          ????????private?IList?GetBlogDetailsForAuthor(int?Id)
          ????????{
          ???????//Write?code?here?to?retrieve?all?blog?details?for?an?author.
          ????????}
          ????}

          使用通用的 Lazy

          接下來讓我們看看如何使用泛型的?Lazy?實(shí)現(xiàn)單例模式,下面的?StateManager?是線程安全的,同時(shí)為了演示?延遲初始化,我使用了 靜態(tài)構(gòu)造函數(shù) 來確保 C# 編譯器不會(huì)將它標(biāo)記為?beforefieldinit


          ????public?sealed?class?StateManager
          ????{
          ????????private?StateManager()
          ????????{
          ????????}

          ????????public?static?StateManager?Instance
          ????????{
          ????????????get
          ????????????{
          ????????????????return?Nested.obj;
          ????????????}
          ????????}
          ????????private?class?Nested
          ????????{
          ????????????static?Nested()
          ????????????{
          ????????????}
          ????????????internal?static?readonly?StateManager?obj?=?new?StateManager();
          ????????}
          ????}

          下面我用?Lazy?來包裝 StateManager,你會(huì)發(fā)現(xiàn)使用?Lazy?來做延遲初始化真的是太簡(jiǎn)單了。。。


          ????public?class?StateManager
          ????{
          ????????private?static?readonly?Lazy?obj?=?new?Lazy(()?=>?new?StateManager());
          ????????private?StateManager()?{?}
          ????????public?static?StateManager?Instance
          ????????{
          ????????????get
          ????????????{
          ????????????????return?obj.Value;
          ????????????}
          ????????}
          ????}

          可以瞄一下上面代碼的 Instance 屬性,它被做成只讀屬性了,同時(shí)也要注意?obj.Value?也是一個(gè)只讀屬性。


          ????public?class?Lazy<T>
          ????{
          ????????public?T?Value
          ????????{
          ????????????get
          ????????????{
          ????????????????if?(_state?!=?null)
          ????????????????{
          ????????????????????return?CreateValue();
          ????????????????}
          ????????????????return?_value;
          ????????????}
          ????????}
          ????}

          延遲初始化 是一個(gè)很不錯(cuò)的性能優(yōu)化技術(shù),它允許你將那些 資源密集型 的對(duì)象延遲到你真正需要加載的時(shí)候再加載,大家結(jié)合自己的場(chǎng)景盡情的使用吧!

          譯文鏈接:https://www.infoworld.com/article/3227207/how-to-perform-lazy-initialization-in-c.html


          往期精彩回顧




          【推薦】.NET Core開發(fā)實(shí)戰(zhàn)視頻課程?★★★

          .NET Core實(shí)戰(zhàn)項(xiàng)目之CMS 第一章 入門篇-開篇及總體規(guī)劃

          【.NET Core微服務(wù)實(shí)戰(zhàn)-統(tǒng)一身份認(rèn)證】開篇及目錄索引

          Redis基本使用及百億數(shù)據(jù)量中的使用技巧分享(附視頻地址及觀看指南)

          .NET Core中的一個(gè)接口多種實(shí)現(xiàn)的依賴注入與動(dòng)態(tài)選擇看這篇就夠了

          10個(gè)小技巧助您寫出高性能的ASP.NET Core代碼

          用abp vNext快速開發(fā)Quartz.NET定時(shí)任務(wù)管理界面

          在ASP.NET Core中創(chuàng)建基于Quartz.NET托管服務(wù)輕松實(shí)現(xiàn)作業(yè)調(diào)度

          現(xiàn)身說法:實(shí)際業(yè)務(wù)出發(fā)分析百億數(shù)據(jù)量下的多表查詢優(yōu)化

          關(guān)于C#異步編程你應(yīng)該了解的幾點(diǎn)建議

          C#異步編程看這篇就夠了


          瀏覽 25
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  性欧美18 | 人人摸人人摸 | 果冻传媒堕落人妻四玛丽莲A - 神秘资源 | 色情一级AA片免费观看 | 操你逼逼|