2011-10-28 18 views
17

Eventuali duplicati:
When to Use Static Classes in C#C# classe statica perché usare?

ho impostato la mia classi molto statica, ma non sono sicuro di quando uso statico o no, o che cosa è la differenza che fa per usarlo o non.

qualcuno può spiegare per favore?

+1

classi/metodi statici sono ad esempio utili per implementare il modello Singleton e il modello Factory ... – Yahia

+2

@Yahia: schema Singleton con classi statiche? [Non credo.] (Http://stackoverflow.com/questions/3565482/can-singleton-class-be-static/3565496#3565496) – BoltClock

+0

@BoltClock SE leggi attentamente, allora ho scritto "Classi statiche/metodi "e sono abbastanza sicuro che i metodi statici sono utili quando si implementa un modello Singleton ... – Yahia

risposta

26

Fare una statica di classe impedisce semplicemente alle persone di provare a crearne un'istanza. Se tutta la tua classe ha membri statici, è una buona pratica rendere la classe stessa statica.

+5

Perché è una buona pratica rendere la classe statica se tutti i membri sono statici? Quale sarà il vantaggio di rendere la classe stessa statica? –

+2

Impedirà alle persone di tentare di istanziarlo –

+5

Ma a tale scopo, è possibile dichiarare un costruttore privato e creare la classe Singleton. Per quanto ne so, una classe statica rimarrà sempre nella memoria creando un sovraccarico, ma le normali classi di singleton non lo faranno. –

11

Se una classe viene dichiarata statica, le variabili e i metodi devono essere obbligatoriamente dichiarati come statici.

Una classe può essere dichiarata statica, a indicare che contiene solo membri statici. Non è possibile creare istanze di una classe statica utilizzando la nuova parola chiave. Le classi statiche vengono caricate automaticamente dal Common Language Runtime (CLR) di .NET Framework quando viene caricato il programma o lo spazio dei nomi contenente la classe.

Utilizzare una classe statica per contenere metodi non associati a un oggetto particolare. Ad esempio, è un requisito comune creare un insieme di metodi che non agiscono sui dati dell'istanza e non sono associati a un oggetto specifico nel codice. È possibile utilizzare una classe statica per contenere tali metodi.

-> Le caratteristiche principali di una classe statica sono:

  • contengono solo membri statici.
  • Non possono essere istanziati.
  • Sono sigillati.
  • Non possono contenere costruttori di istanze o semplicemente costruttori poiché sappiamo che sono associati agli oggetti e operano sui dati quando viene creato un oggetto.

Esempio

static class CollegeRegistration 
{ 
    //All static member variables 
    static int nCollegeId; //College Id will be same for all the students studying 
    static string sCollegeName; //Name will be same 
    static string sColegeAddress; //Address of the college will also same 

    //Member functions 
    public static int GetCollegeId() 
    { 
    nCollegeId = 100; 
    return (nCollegeID); 
    } 
    //similarly implementation of others also. 
} //class end 


public class student 
{ 
    int nRollNo; 
    string sName; 

    public GetRollNo() 
    { 
     nRollNo += 1; 
     return (nRollNo); 
    } 
    //similarly .... 
    public static void Main() 
    { 
    //Not required. 
    //CollegeRegistration objCollReg= new CollegeRegistration(); 

    //<ClassName>.<MethodName> 
    int cid= CollegeRegistration.GetCollegeId(); 
    string sname= CollegeRegistration.GetCollegeName(); 


    } //Main end 
} 
+0

obbligatoriamente obbligatoriamente obbligatoriamente obbligatoriamente obbligatoriamente obbligatoria –

3

classi statiche può essere utile in certe situazioni, ma c'è un potenziale di abuso e/o uso eccessivo, come la maggior parte caratteristiche del linguaggio.

Come già detto da Dylan Smith, il caso più ovvio per l'utilizzo di una classe statica è se si dispone di una classe con solo metodi statici. Non ha senso consentire agli sviluppatori di creare un'istanza di una classe del genere.

L'avvertenza è che una sovrabbondanza di metodi statici può di per sé indicare un difetto nella strategia di progettazione. Trovo che quando si crea una funzione statica, è un bene chiedersi - sarebbe meglio adatto come a) un metodo di istanza, o b) un metodo di estensione di un'interfaccia. L'idea qui è che i comportamenti degli oggetti sono generalmente associati allo stato dell'oggetto, il che significa che il comportamento dovrebbe appartenere all'oggetto. Utilizzando una funzione statica si sta implicando che il comportamento non dovrebbe appartenere a un particolare oggetto.

La progettazione di elementi polimorfici e interfacciati è ostacolata dall'uso eccessivo di funzioni statiche: non possono essere sostituite in classi derivate, né possono essere collegate a un'interfaccia.Solitamente è meglio avere le proprie funzioni di "helper" legate a un'interfaccia tramite un metodo di estensione tale che tutte le istanze dell'interfaccia abbiano accesso a quella funzionalità di "supporto" condivisa.

Una situazione in cui le funzioni statiche sono sicuramente utili, secondo me, è nella creazione di un metodo .Create() o .New() per implementare la logica per la creazione dell'oggetto, ad esempio quando si desidera eseguire il proxy dell'oggetto che si sta creando,

public class Foo 
{ 
    public static Foo New(string fooString) 
    { 
     ProxyGenerator generator = new ProxyGenerator(); 

     return (Foo)generator.CreateClassProxy 
      (typeof(Foo), new object[] { fooString }, new Interceptor()); 
    } 

Questo può essere utilizzato con un quadro proxy (come il Castello dinamica Proxy) in cui si desidera intercettare/iniettare funzionalità in un oggetto, in base a esempio, certi attributi assegnati ai suoi metodi. L'idea generale è che hai bisogno di un costruttore speciale perché tecnicamente stai creando una copia dell'istanza originale con funzionalità aggiuntive speciali.

Problemi correlati