日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C# Lazy Loading

發布時間:2023/12/4 C# 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# Lazy Loading 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

按需加載對象延遲加載實際是推遲進行創建對象,直到對其調用后才進行創建初始化,延遲(懶加載)的好處是提高系統性能,避免不必要的計算以及不必要的資源浪費。

常規有這些情況:

  • 對象創建成本高且程序可能不會使用它。例如,假定內存中有具有 Orders 屬性的 Customer 對象,該對象包含大量 Order 對象,初始化這些對象需要數據庫連接。如果用戶永遠不要求顯示 Orders 或在計算中使用該數據,則無需使用系統內存或計算周期來創建它。通過使用 Lazy

    ?來聲明 Orders對象用于遲緩初始化,可以避免在不使用該對象時浪費系統資源。
  • 對象創建成本高,且希望將其創建推遲到其他高成本操作完成后。例如,假定程序在啟動時加載多個對象實例,但是只需立即加載其中一部分。可以通過推遲初始化不需要的對象,直到創建所需對象,提升程序的啟動性能。(來源官方)

示例

創建用戶類

Copy
public class User
{
public string Name { get; set; }

public int Age { get; set; }


public User() {
this.Name = "Name";
this.Age = 0;
}
}

默認情況下,Lazy?對象是線程安全的。也就是說,如果構造函數沒有指定線程安全性的類型,該函數創建的 Lazy?對象是線程安全的。在多線程方案中,訪問線程安全 Lazy?對象的 Value 屬性的第一個線程會為所有線程上的所有后續訪問對其初始化,且所有線程共享相同的數據。因此,哪個線程初始化對象并不重要,爭用條件是良性的。

Copy
class Program
{
static void Main(string[] args)
{
Lazy<User> user = new Lazy<User>();
ThreadLocal<User> threadLocal = new ThreadLocal<User>();

if (!user.IsValueCreated)
Console.WriteLine("The object is not initialized");
Console.WriteLine(user.Value.Name);
user.Value.Name = "Name1";
user.Value.Age = 1;
Console.WriteLine(user.Value.Name);
Console.Read();
}
}

對象的線程安全性LazyThreadSafetyMode mode 參數布爾 isThreadSafe 參數沒有線程安全性參數
完全線程安全;一次只有一個線程嘗試初始化值。ExecutionAndPublicationtrue可以。
非線程安全。Nonefalse不適用。
完全線程安全;線程爭用以初始化值。PublicationOnly不適用。不適用。

其中IsValueCreated屬性是個Boolean類型,我們可以通過此屬性去確定當前對象有沒有被初始化

調用后,進行了創建操作

再說說Lazy中幾個構造函數,

  • public Lazy (bool isThreadSafe)
    isThreadSafe 的布爾參數,該方法參數用于指定是否從多線程訪問 Value 屬性。如果想要僅從一個線程訪問屬性,則傳入 false 以獲取適度的性能優勢。如果想要從多線程訪問屬性,則傳入 true 以指示 Lazy?實例正確處理爭用條件(初始化時一個線程引發異常)。

  • public Lazy (LazyThreadSafetyMode mode):提供線程安全模式。

  • public Lazy (Func?valueFactory)
    lambda 表達式傳遞給新的 Lazy?對象的構造函數。下一次訪問 Value 屬性將導致新 Lazy?的初始化,并且其 Value 屬性此后會返回已分配給該屬性的新值。

總結

參考:https://docs.microsoft.com/en-us/dotnet/framework/performance/lazy-initialization

總結

以上是生活随笔為你收集整理的C# Lazy Loading的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。