2015-09-23 17 views
5

Vì vậy, với thương hiệu mới C# 6, chúng tôi đã có các trình khởi tạo tự động thuộc tính gọn gàng. Tôi nghĩ rằng tôi cũng có thể tận dụng lợi thế của những điều này để làm cho những người độc thân ngắn gọn hơn bao giờ hết. Rõ ràng là someone else cũng có ý tưởng đó.Trình khởi tạo thuộc tính tự động Thực hiện Singleton

public sealed class Singleton 
{ 
    public static Singleton Instance { get; } = new Singleton(); 
    private Singleton() { /* some initialization code */ } 
} 

Câu hỏi của tôi là:

  1. Làm thế nào thread-safe nó là gì?
  2. Mức độ lười biếng hoặc khi thực tế được tạo ra? (không phải là ưu tiên, nhưng nó sẽ là tốt để tham khảo trong tương lai)
  3. Đó có phải là một ý tưởng hay?

(nó có thể trông giống như this question, nhưng nó không phải)

Trả lời

6

Mã của bạn sẽ được mở rộng như sau:

public sealed class Singleton 
{ 
    private static readonly Singleton <Instance>k__BackingField = new Singleton(); 
    public static Singleton Instance { get { return <Instance>k__BackingField; } } 
    private Singleton() { /* some initialization code */ } 
} 

(<Instance>k__BackingFieldunspeakable name của trường biên dịch tạo ra.)

Vì vậy, các thuộc tính của mã của bạn sẽ chính xác giống như mã bên trên. Cụ thể, mẫu này an toàn và có thể là một ý tưởng hay, tùy thuộc vào hoàn cảnh.

Giả sử bạn không truy cập bất kỳ thành viên tĩnh nào khác thuộc loại này trước khi truy cập Instance, thì mức độ lười biếng chính xác là tùy thuộc vào thời gian chạy. Thông thường, nó sẽ giống như "dụ được tạo lần đầu tiên một phương thức mà có thể truy cậpInstance được biên dịch JIT", nhưng bạn không có bất kỳ đảm bảo nào về điều này.

Nếu bạn muốn đảm bảo rằng cá thể được tạo ngay trước khi Instance được truy cập lần đầu tiên, hãy thêm một hàm tạo tĩnh trống vào lớp của bạn. (Điều này có thể có tác động tiêu cực nhỏ đến hiệu suất, nhưng điều đó có thể không quan trọng với bạn.)

Vì hầu hết điều này không thực sự cụ thể đối với C# 6, một nguồn thông tin bổ sung sẽ là bài viết của Jon Skeet về singletonsstatic constructors/type initializers.

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