日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C#使用Lazy<T>實現對客戶訂單的延遲加載_C#教程

作者:Darren?Ji ? 更新時間: 2022-10-23 編程語言

"延遲加載"是指在需要的時候再加載數據。比如獲得一個Customer信息,并不會把該Customer的Orders信息一下加載出來,當需要顯示Orders的時候再加載。簡單來說,就是按需加載。使用"延遲加載"的好處是減少應用程序響應時間,降低內存消耗,避免不必要的數據庫交互。

即時加載

創建Order類和Customer類,Customer中維護著Order的一個集合,在Customer的構造函數中給Order集合賦值。即,只要創建Customer實例,就會加載該Customer的所有Order。

關于Customer和Order類。

    public class Customer
    {
        private List<Order> _orders = null;
        public List<Order> Orders
        {
            get { return _orders; }
        }
        private string _customerName;
        public string CustomerName
        {
            get { return _customerName; }
            set { CustomerName = value; }
        }
        public Customer()
        {
            _customerName = "darren";
            _orders = LoadOrders();
        }
        private List<Order> LoadOrders()
        {
            List<Order> result = new List<Order>();
            Order o = new Order();
            o.OrderNumber = "001";
            result.Add(o);
            o = new Order();
            o.OrderNumber = "002";
            result.Add(o);
            return result;
        }
    }
    public class Order
    {
        private string _orderNumber;
        public string OrderNumber
        {
            get { return _orderNumber; }
            set { _orderNumber = value; }
        }
    }

客戶端調用:

    class Program
    {
        static void Main(string[] args)
        {
            Customer customer = new Customer();
            Console.WriteLine(customer.CustomerName);
            foreach (var order in customer.Orders)
            {
                Console.WriteLine(order.OrderNumber);
            }
            Console.ReadKey();
        }
    }

把斷點打在foreach所在行,為customer變量添加監視, 就發現:在創建Customer實例的同時,加載了該Customer的所有Order。?????

Lazy<T>實現延遲加載

對于延遲加載,在這里,需求變成:在創建Customer實例的時候先不要加載該Customer的任何Order,等到遍歷、顯示Orders的時候再加載該Customer的所有的Order。

把Customer的_orders字段設置為驗證加載。

private Lazy<List<Order>> _orders = null;

Customer的Orders屬性的get訪問器中修改如下。

        public List<Order> Orders
        {
            get { return _orders.Value; }
        }

構造函數中修改如下:

        public Customer()
        {
            _customerName = "darren";
            _orders = new Lazy<List<Order>>(() => LoadOrders());
        }

Customer類,修改后,完整如下:

    public class Customer
    {
        private Lazy<List<Order>> _orders = null;
        public List<Order> Orders
        {
            get { return _orders.Value; }
        }
        private string _customerName;
        public string CustomerName
        {
            get { return _customerName; }
            set { CustomerName = value; }
        }
        public Customer()
        {
            _customerName = "darren";
            _orders = new Lazy<List<Order>>(() => LoadOrders());
        }
        private List<Order> LoadOrders()
        {
            List<Order> result = new List<Order>();
            Order o = new Order();
            o.OrderNumber = "001";
            result.Add(o);
            o = new Order();
            o.OrderNumber = "002";
            result.Add(o);
            return result;
        }
    }

還是把斷點打在客戶端foreach代碼行,運行。

可見,在沒有遍歷之前,Customer的_orders字段的Value屬性值為null。

F11,進入循環遍歷

可見,當進入遍歷,獲取Customer實例的Order值的時候,延遲加載開始,_orders字段的屬性值不再為null。

總結:當我們希望類的某個屬性實現延遲加載,首先設計一個Lazy<T>類型的字段,然后在該屬性的get訪問器中,通過Lazy<T>類型字段的Value屬性獲取值,最后在該類構造函數中實現針對Lazy<T>類型字段的初始化。

原文鏈接:https://www.cnblogs.com/darrenji/p/3959855.html

欄目分類
最近更新