2011-06-21 39 views
19

Khởi tạo lười biếng là gì. đây là mã tôi nhận được sau khi tìm kiếm google.Khởi tạo lười biếng trong .NET 4

class MessageClass 
{ 
    public string Message { get; set; } 

    public MessageClass(string message) 
    { 
     this.Message = message; 
     Console.WriteLine(" *** MessageClass constructed [{0}]", message); 
    } 
} 

Lazy<MessageClass> someInstance = new Lazy<MessageClass>(
    () => new MessageClass("The message") 
    ); 

tại sao tôi nên tạo đối tượng theo cách này .... khi thực sự chúng ta cần tạo đối tượng theo cách này ...... tìm câu trả lời.

Trả lời

48

Mục đích của tính năng Lazy trong .NET 4.0 là để thay thế một mô hình nhiều nhà phát triển sử dụng trước đó với tài sản. Cách "cũ" sẽ là một cái gì đó như là

private MyClass _myProperty; 

public MyClass MyProperty 
{ 
    get 
    { 
     if (_myProperty == null) 
     { 
      _myProperty = new MyClass(); 
     } 
     return _myProperty; 
    } 
} 

Chỉ được tạo một lần và khi cần thiết. Nếu nó không bao giờ cần thiết, nó không bao giờ được khởi tạo. Để làm được điều tương tự với Lazy, bạn có thể viết

private Lazy<MyClass> _myProperty = new Lazy<MyClass>(() => new MyClass()); 

public MyClass MyProperty 
{ 
    get 
    { 
     return _myProperty.Value; 
    } 
} 

Tất nhiên, bạn không bị giới hạn để làm việc theo cách này với Lazy, nhưng mục đích là để xác định làm thế nào để tạo một giá trị mà không thực sự làm như vậy cho đến khi nó là cần thiết. Mã gọi không cần phải theo dõi liệu giá trị đã được khởi tạo hay chưa; thay vào đó, mã gọi chỉ sử dụng thuộc tính Value. (Có thể tìm hiểu xem giá trị đã được khởi tạo với thuộc tính IsValueCreated.)

+0

khi MyProperty thuộc tính sẽ được gọi ... nếu dòng sau thực hiện riêng tư Lazy _myProperty = new Lazy (() => new MyClass()); làm thế nào tài sản sẽ được gọi là ..... tôi chỉ không hiểu vì chúng ta cần phải gọi tài sản luôn luôn rõ ràng. – Mou

+0

@ user728750 Tôi không hoàn toàn chắc chắn rằng tôi hiểu những gì bạn đang yêu cầu. '_myProperty' chỉ là một biến cá thể riêng. Bạn cũng có thể khởi tạo nó trong hàm tạo của lớp có chứa (thực tế có thể là thực hành tốt hơn). Việc sử dụng thuộc tính có phần tùy chọn, nhưng nó tóm tắt lệnh gọi '.Value' nếu không cần thiết. – Andrew

+0

Hài hước rằng điều tương tự này có thể được thực hiện trong Scala chỉ với 'lazy val MyProperty = new MyClass()'. Quá xấu họ không bao giờ có xung quanh để phát hành một trình biên dịch Scala cho. Net. – sparebytes

6

Kiểm tra tài liệu MSDN ở đây: Lazy Initialization

khởi Lazy của một đối tượng có nghĩa là tạo được trì hoãn cho đến khi nó được sử dụng đầu tiên. Khởi tạo lười biếng chủ yếu được sử dụng để cải thiện hiệu suất, tránh tính toán lãng phí và giảm yêu cầu bộ nhớ chương trình.

8

"khởi Lazy xảy ra lần đầu tiên sở hữu Lazy.Value được truy cập hoặc phương pháp Lazy.ToString được gọi.

Sử dụng một thể hiện của Lazy trì hoãn việc tạo ra một đối tượng lớn hoặc nhiều tài nguyên hoặc thực hiện tác vụ tốn nhiều tài nguyên, đặc biệt khi việc tạo hoặc thực thi như vậy có thể không xảy ra trong suốt thời gian tồn tại của chương trình. "

http://msdn.microsoft.com/en-us/library/dd642331.aspx

Các vấn đề liên quan