C 中的Lazy如何使用詳解

2022-09-26 01:36:10 字數 2245 閱讀 9916

延遲初始化 是一種將物件的建立延遲到第一次需要用時的技術,換句jmdilc話說,物件的初始化是發生在真正需要的時候才執行,值得注意的是,術語  延遲初始化 和  延遲例項化 的意思是相同的——可以互換使用,通過使用  延遲初始化 技術,可以避免應用程式不必要的計算和記憶體消耗,這篇文章我們將會討論如何在 c# 中使用 延遲初始化。

有些朋友聽完這些可能會懵逼,接下來用乙個簡單的例子來了解下 延遲載入 的場景,考慮下面兩個類,  customer 和  order , customer 類包含了乙個 orders 屬性,乙個人肯定會有很多的訂單,也就意味著它可能包含了很多的資料,甚至還需要連線資料庫去獲取 orders 記錄,在這種場景下,沒必要給 customer 集合中的所有人都帶上完整的 orders,這個初始化開銷是巨大的,優化點就是不載入 orders,直到某些 customer 真的需要 orders 時才按需灌入。

你可以自己寫一段邏輯來實現 延遲初始化 ,在  .net framework 4.0 之後就沒必要了, 因為在  system 命名空間下已經提供了  lazy ,而且還是  執行緒安全 的,可以使用這個類來延遲 資源密集型 的物件按需建立。

當使用 lazy 的時候,這裡的 t 就是你要延遲的集合,那如何做到按需載入呢?呼叫  lazy.value 即可,下面的**片段展示了如何使用  lazy 。

程式設計客棧lazy> orders = new lazy>();

ienumerable result = lazyorders.value;

現在,考慮下面的兩個類: author 和  blog ,乙個作者可以寫很多文章,所以這兩個類之間是  一對多 的關係,下面的**片段展示了這種關係。

public class author

public string firstname

public string lastname

public string address

public list blogs

} public class blog

public string title

public datetime publicationdate

}值得注意的是,關係型資料庫中的 一對多 關係對映到物件模型就是  author 類中增加乙個 list blogs 屬性,使用這個屬性,author 就可以維持乙個或者多個 blog 例項物件,對吧。

現在假定在 使用者介面 上僅需展示 author 的基礎資訊,比如說:(firstname,lastname,address),在這種場景下,給 author 物件載入 blogs 集合是毫無意義的,當真的需要載入 blogs 時,執行 blogs.value 即可立即執行,下面展示了  lazy blogs 的用法。

public class author

public string firstname

public string lastname

public string address

public lazy> blogs => new lazy>(() => getblogdetailsforauthor(this.id));

private ilist getblogdetailsforauthor(int id)

}接下來讓我們看看如何使用泛型的 lazy 實現單例模式,下面的  statemanager 是執行緒安全的,同時為了演示  延遲初始化 ,我使用了 靜態建構函式 來確保 c# 編譯器不會將它標記為  beforefieldinit 。

public sealed class statemanager

publi程式設計客棧c static statemanager instance

}private class nested

internal static readonly statemanager obj = new statemanager();}}

下面我用 lazy 來包裝 statemanager,你會發現使用  lazy 來做延遲初始化真的是太簡單了。。。

public class statemanager

public static statemanagejmdilcr instance}}

可以瞄一下上面**的 instance 屬性,它被做成唯讀屬性了,同時也要注意 obj.value 也是乙個唯讀屬性。

public class lazy

return _value;}}

}延遲初始化 是乙個很不錯的效能優化技術,它允許你將那些 資源密集型 的物件延遲到你真正需要載入的時候再載入,大家結合自己的場景盡情的使用吧!

hibernate中lazy的使用

lazy 延遲載入 lazy 的有效期 只有在 session 開啟的時候才有效 session 關閉後lazy 就沒效了。lazy 策略可以用在 標籤上 可以取值true false 標籤上,可以取值true false,這個特性需要類增強 等集合上,可以取值為true false extra 等...

hibernate中lazy的使用

lazy,延遲載入 lazy的有效期 只有在session開啟的時候才有效 session關閉後lazy就沒效了。lazy策略可以用在 標籤上 可以取值true false 標籤上,可以取值true false,這個特性需要類增強 等集合上,可以取值為true false extra 等標籤上,可以...

hibernate中lazy的使用

lazy 延遲載入 lazy 的有效期 只有在 session 開啟的時候才有效 session 關閉後lazy 就沒效了。lazy 策略可以用在 標籤上 可以取值true false 標籤上,可以取值true false,這個特性需要類增強 等集合上,可以取值為true false extra 等...