2013-05-14 7 views
7

Sto cercando di capire i metodi statici e ho raggiunto un punto di confusione.Perché non dovresti usare metodi statici per tutti i metodi privati?

Concentrando l'attenzione solo sui metodi per questa domanda, se creo un'istanza del mio oggetto (in cui la classe stessa non è statica), in genere ho solo accesso ai metodi pubblico, protetto o interno (in base all'ambito/incapsulamento). In altre parole, non ho accesso ai metodi privati.

Ho letto che, sebbene i metodi statici minimi sono leggermente più efficienti dei metodi non statici.

Quindi, quando si crea un metodo privato con un tipo restituito di vuoto, ed escluso quando si crea un riferimento di un oggetto da sé stesso, perché non lo si dovrebbe mai rendere statico? Tutto il codice che abbia mai visto non lo fa, quindi posso solo presumere di aver mancato il punto.

+3

Per lo stesso motivo per cui non si dovrebbe rendere tutto 'statico', perché si desidera beneficiare di OOP. Quindi hai bisogno di istanze. Anche i metodi privati ​​sono normalmente correlati a un'istanza. –

risposta

29

I metodi statici non possono accedere ai dati dei membri non statici nella classe.

6

In genere si suppone che i metodi statici siano senza stato e pertanto non abbiano accesso allo stato dell'istanza. Al contrario, i metodi di istanza sono stateful e possono quindi leggere e modificare lo stato dell'istanza.

Tipici esempi di metodi senza stato sono:

  • metodi di fabbrica
  • operatori binari
  • ...

Naturalmente, i metodi statici non sono sempre senza stato, però, ci sono esempi di metodi statici statici. C'è uno stato unico per la classe poi:

  • Singleton
  • Piscine istanza
  • ...

Queste implementazioni hanno bisogno di un po 'più attenzione, però, dal momento che lo stato della classe è anche condiviso da tutti i thread all'interno del processo.

0

La maggior parte dei metodi visualizzati nel codice utilizza in qualche modo variabili/proprietà di classe che non sono statiche. Non è possibile accedervi da un contesto statico. Ciò significa che all'interno di un metodo statico, è possibile accedere solo ai membri statici di questa classe e non a quelli specifici dell'oggetto.

1

Ho letto che, sebbene i metodi statici minimi sono leggermente più efficienti dei metodi non statici.

Questo non è incondizionatamente vero: solo i metodi che potrebbero altrimenti essere static ma non sono fatte static per omissione sarebbe più efficiente.Altrimenti, è necessario passare manualmente un riferimento all'oggetto, livellando il campo di gioco. Inoltre, CLR è ottimizzato così tanto che la differenza è difficile da misurare.

Per rispondere alla domanda, non vi è alcun motivo per rendere un metodo non statico se non accede allo stato dell'istanza tramite proprietà o variabili. Tuttavia, tutti i metodi che accedono allo stato per istanza devono essere non statici per la leggibilità, poiché non ci sono prestazioni da ottenere rendendole statiche e passando l'istanza manualmente.

per illustrare il punto, lo si dovrebbe fare

private void AddCount(int number) { 
    current += number; 
} 

piuttosto che questo:

// Do not do this! 
private static void AddCount(MyClass obj, int number) { 
    obj.current += value; 
} 
1

Non è possibile accedere ai membri non statici della classe, se si esegue questa operazione. È possibile passare in qualsiasi variabile di istanza come parametri a una funzione statica privata, ma soprattutto quando una funzione interagisce con molti dati di istanza, ciò può portare a un codice molto prolisso e difficile da leggere. Se stai operando su membri di istanza di una classe e non è un'operazione che può essere eseguita senza un'istanza della tua classe, non dovresti renderla statica.

Come regola generale di base, non faccio variabili o funzioni statiche a meno che non sia fondamentale per tutte le istanze della classe. Ci sono naturalmente delle eccezioni a questo, ma se si rendono semplicemente statici tutti i propri metodi privati ​​senza motivo, è probabile che si stia lavorando contro il paradigma OOP.

0

due ragioni vengono in mente:

  1. non è possibile accedere ad altri membri non statici della classe (di cui sopra)
  2. non è possibile eseguire l'override metodo statico in sottoclassi

IMO, statica i metodi dovrebbero essere più un'eccezione. Se si desidera un "accesso facilitato" a una funzionalità in un'applicazione con contenitore di dipendenze per le dipendenze, è meglio usare un bean singleton e iniettarlo, poiché si avrà comunque un'opzione per cambiare facilmente l'implementazione, se necessario.

.NET ha un caso d'uso specifico per metodi statici - metodi di estensione. Quindi, se vuoi che la tua funzionalità sia disponibile come metodo di estensione, devi usare la staticità.