2012-07-17 14 views
6

Sto guardando un codice scritto da un collega e quello che mi aspettavo accadesse non lo è. Ecco il codice:Cercando di capire come funziona la statica in questo caso

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; 
    } 
} 

In un'altra classe, mi sarei aspettato di essere in grado di fare:

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

e riferimento allo stesso grado di quella classe. Quello che succede è che posso avere solo uno .Instance. Qualcosa che non mi aspettavo. Se la proprietà Instance restituisce una classe SingletonClass, perché non è possibile chiamare la proprietà Instance in quella classe restituita e così via e così via?

risposta

12

Se la proprietà Instance restituisce una classe SingletonClass, perché non posso chiamare la proprietà Instance su quella classe restituita e così via e così via?

Poiché è possibile accedere solo tramite il .InstanceSingletonClasstipo, non attraverso un'istanza di quel tipo.

Dal Instance è statico, è necessario accedere tramite il tipo:

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

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

Quando si tenta di catena di questi, si sta effettivamente facendo:

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 giusto, che ha un senso ora. – Justin

0

Nel codice si restituisce un'istanza di SingletonClass tramite l'istanza che è statica di tipo Singleton

quindi non consente di farlo SingletonClass.Instance.Instance b ecause il SingletonClass.Instance sta tornando un'istanza di SingletonClass

Tutto ciò facendo si sta salvando dal fare questo SingletonClass _instance = new SingletonClass(); per questo SingletonClass.Instance.Instance

Problemi correlati