2012-07-17 24 views
6

Tôi đang xem một số mã mà một đồng nghiệp đã viết và những gì tôi mong đợi sẽ không xảy ra. Đây là mã:Cố gắng hiểu cách tĩnh hoạt động trong trường hợp này

public class SingletonClass 
{ 
    private static readonly SingletonClass _instance = new SingletonClass(); 

    public static SingletonClass Instance 
    { 
     get { return _instance; } 
    } 

    private SingletonClass() 
    { 
     //non static properties are set here 
     this.connectionString = "bla" 
     this.created = System.DateTime.Now; 
    } 
} 

Trong lớp khác, tôi dự kiến ​​sẽ có để có thể làm:

private SingletonClass sc = SingletonClass.Instance.Instance.Instance.Instance.Instance.Instance; 

và nó tham khảo các Instance cùng của lớp đó. Điều gì xảy ra là tôi chỉ có thể có một số .Instance. Một cái gì đó mà tôi không mong đợi. Nếu tài sản Instance trả về một lớp học SingletonClass, tại sao tôi không thể gọi thuộc tính Instance trên lớp đó được trả về, v.v ...

Trả lời

12

Nếu thuộc tính Instance trả về lớp SingletonClass, tại sao tôi không thể gọi thuộc tính Instance trên lớp đó được trả về, v.v ...

Bởi vì bạn chỉ có thể truy cập vào .Instance qua SingletonClassloại, không thông qua một thể hiện của loại đó.

Kể từ Instance là tĩnh, bạn phải truy cập nó thông qua các loại:

SingletonInstance inst = SingletonInstance.Instance; // Access via type 

// This fails, because you're accessing it via an instance 
// inst.Instance 

Khi bạn cố gắng chuỗi này, bạn đang có hiệu quả thực hiện:

SingletonInstance temp = SingletonInstance.Instance; // Access via type 

// ***** BAD CODE BELOW **** 
// This fails at compile time, since you're trying to access via an instance 
SingletonInstance temp2 = temp.Instance; 
+0

Oh đúng, có ý nghĩa bây giờ. – Justin

0

Trong đoạn code bạn đang trở về một thể hiện của SingletonClass thông qua Sơ thẩm là loại tĩnh Singleton

để nó không cho phép bạn làm điều này SingletonClass.Instance.Instance b ecause các SingletonClass.Instance đang trở lại một thể hiện của SingletonClass

Tất cả phải làm là giúp bạn tiết kiệm từ việc này SingletonClass _instance = new SingletonClass(); trong này SingletonClass.Instance.Instance

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