延遲載入(lazy load)也成為懶載入,基本用於orm中資料物件的一種預設載入方式,簡單點講延遲載入機制是為了避免無所謂的效能開銷而提出來的,所謂延遲載入就是當真正需要資料的時候,才真正的執行資料載入操作。可以簡單的理解為,只有使用的時候,才會例項化物件。
最大的有點就是能夠大大的提高系統的效能。
通過乙個案例來講解,舉乙個很大眾的應用場景,在大多的b2c應用中會設計到到使用者開店的情況,這樣我們就設計乙個會員表,乙個店鋪表,當然乙個會員可以開很多歌店鋪,也就是說這裡面一對多的對映。
看一下類圖:
兩個實體類,聚合關係,下面看一下第一種**結構:
using system;看一下執行結果:using system.collections.generic;
namespace lazyloadshop
console.read();}}
public
class users
public
string username
public
string passwrod
public listmyshops
public users(string _name, string _passwrod)}}
public
class shop
public
int shopid
public
int userid
public
string shopname
public
string shopurl
}}
這種結構應對一般的需求是沒問題的,看一下上面的**,可以看到,店鋪(shop)類是在使用者(user)的建構函式中實現的例項化,也就是說我們在例項化使用者(user)的時候,我們的店鋪(shop)類同樣被例項化,當然,在這種應用場景下是沒問題,但是假如應用場景變化了呢,乙個使用者對應n個店鋪,也就是說,在我操作user的時候同樣也在攜帶者店鋪(shop)這個類,顯然這種方式會對效能有所損耗,尤其當我們只需要使用者(user)不需要店鋪(shop)的時候,這簡直就是一種記憶體浪費,我們想要達到的效果是:我們需要什麼物件你給我例項化什麼
根據這個需求,我們更改一下**結構,我們只需要更改下使用者類(user),第二版:
public我們在user類中公開了list通過判斷是否為空,而延遲例項化到店鋪類(shop)中,執行結果通第一版,其實延遲載入在orm中很多成熟的框架已經採用這種思路,當然在.net中不能落伍的,在.net 4.0中微軟已經為我們提供了專門用於延遲載入的類庫lazy<>類,我們看一下通過該類我們怎樣實現店鋪(shop)類的延遲載入。class users
public
string username
public
string passwrod
private listmyshops;
public listmyshops;}
}public users(string _name, string _passwrod)
}
同樣我們還是只需要更改使用者類(user),第三版**:
public執行結果同上,這裡需要注意點就是雖然我們在user中建構函式實現了lazy>類的例項,但是list是未被例項化的,我們需要在lazy的建構函式中指定他的**函式。class users
public
string username
public
string passwrod
private
readonly lazy> myshops;
public listmyshops
}public users(string _name, string _passwrod)
}
還需注意的是上面的更改我們應用到了單例模式來實現list是唯一的。
看以看出,lazy的引入使我們大大的簡便了我們延遲初始化。
上傳下原始碼
Windows核心原理與實現之核心載入
在intel x86系統上,windows作業系統獲得控制首先從硬碟的主引導記錄 mbr 開始,windows setup程式在安裝windows時填充mbr 其他的磁碟管理器也可能填充mbr mbr包含 和資料,其 稱為引導 在系統引導時首先獲得控制 mbr中的資料時一張分割槽表,制定了每個分割槽...
kafka原理解析之 訊息可靠性保障
本文討論的是假設存在完美無缺的producer和consumer,從broker角度保障資料可靠的機制。當isr集合發生增減 或者isr集合中任一副本leo發生變化時,都會影響整個分割槽的hw。如上圖所示 leader的leo為9,follower的leo為7,而follower2的leo為6,若判...
分布式技術架構原理解析之協調與同步(五)分布式鎖
前面的文章詳細介紹了 分布式互斥 解釋了同一臨界資源 共享資源 同一時刻只能被乙個程式訪問的問題,也就是說只有獲得訪問許可權的程序才可以訪問共享資源,而此時其他程序必須等待擁有該許可權的程序釋放許可權。那麼在訪問共享資源時,這個許可權是如何設定或產生的呢?以及設定或產生這個許可權的工作原理是什麼?本...