2012-04-03 41 views
8

Tôi có một lớp học với một tài sản đó là một từ điển:Lazy thuộc tính từ điển trong C#

public class Entity 
{ 
     public Dictionary<string, string> Name { get; set; } 
} 

Tôi muốn chuyển tài sản này để sử dụng initializtion lười biếng. Tôi đã thử các cách sau:

public class Entity 
{ 
     private Lazy<Dictionary<string, string>> name = new Lazy<Dictionary<string, string>>(() => new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)); 
     public Dictionary<string, string> Name 
     { 
      get 
      { 
       return name; 
      } 
      set 
      { 
       name = value; 
      } 
     } 
} 

Đây là lỗi tất nhiên, vì Tên và tên có các loại khác nhau. Đối với cuộc sống của tôi mặc dù, tôi không thể tìm ra cách để xác định điều này một cách chính xác. Tất cả những gì tôi thực sự muốn là có Tên vẫn giữ nguyên cho đến khi tôi truy cập nó, sau đó tạo nó trên lần đọc hoặc viết đầu tiên.

Trả lời

10

Bạn có thể sử dụng khởi tạo với Lazy, nhưng những gì bạn muốn là khá đơn giản và bạn chỉ có thể làm

private Dictionary<string, string> _name; 
    public Dictionary<string, string> Name 
    { 
     get 
     { 
      if(_name == null) 
       _name = new Dictionary<string, string>(); 
      return _name; 
     } 
     set 
     { 
      _name = value; 
     } 
    } 

EDIT này: Lưu ý rằng phương pháp này sẽ có một số vấn đề an toàn thread. Kiểm tra xem điều này có thể là một vấn đề cho bạn hay không.

+0

Bạn có điều kiện chủng tộc trong đó. – LukeH

+0

Vâng, tôi đã thêm một lưu ý về điều này có thể là khi bạn đang nhập nhận xét của mình. ;) – Vache

+1

D'oh, có vẻ như tôi đang sử dụng găng tay [của người biến chứng] (http://thedailywtf.com/Articles/The_Complicator_0x27_s_Gloves.aspx). Đây là những gì xảy ra khi tôi trở nên say mê với một tính năng tuyệt vời. Cảm ơn, tôi sẽ đánh dấu đây là câu trả lời ngay khi SO cho phép tôi. Bây giờ, bởi vì tôi có một loạt những thứ này, tôi chỉ cần làm một số loại nhà máy cho họ. –

7

name.Value là chỉ đọc. Hãy thử điều này:

public class Entity 
{ 
    private Lazy<Dictionary<string, string>> name = 
     new Lazy<Dictionary<string, string>>(
      () => new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)); 

    public Dictionary<string, string> Name 
    { 
     get 
     { 
      return name.Value; 
     } 
    } 
} 
+0

Đó là đọc-ghi. –

+1

Lười biếng . Thuộc tính giá trị là chỉ đọc: http://msdn.microsoft.com/en-us/library/dd642177.aspx Nếu bạn có nghĩa là yêu cầu của bạn là dành cho thuộc tính đọc-ghi, thì giải pháp ở trên không đầy đủ. – bouvierr

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