Membri della class statici e non statici

Sono nuovo di c sharp e programmazione in generale. Ho una breve domanda: che cosa è la migliore pratica per quanto riguarda le variabili statiche / non statiche.

Ho una variabile, int int privata, che appartiene alla class y. Per accedere a questa variabile, ho bisogno di riferimento y. Se x era statico, tuttavia, posso accedere a questa variabile senza riferimenti a y.

Qual è il modo migliore per andare, in una situazione in cui diversi metodi all’interno della class si riferiranno a questo valore?

Spero che questo abbia senso, e la mia domanda non è troppo semplice!

Grazie molto

È necessario pensare alle variabili statiche come appartenenti alla class , non alle istanze della class.

Se, in tutte le istanze della class, questa variabile deve essere identica, utilizzare una variabile statica.

In caso contrario, utilizzare una variabile di istanza.

In generale avere variabili statiche pubbliche è una ctriggers pratica – è una risorsa globale condivisa e se la si modifica è necessario sincronizzarne l’accesso. Avere uno stato globale è qualcosa che si vuole evitare il più ansible.

La migliore pratica è quella di evitare la staticità pubblica. In OOP, la class ha lo scopo di hide i suoi membri. Statico in realtà non è un membro dell’istanza ma del tipo .

Statico è utile se stai implementando un modello singleton. Ma poi di nuovo hanno bisogno di essere resi privati ​​e accessibili attraverso una proprietà pubblica.

È necessario leggere Classi statiche e membri di classi statiche (Guida di programmazione C #) .

Beh, non posso dire in modo conclusivo che uno è migliore, perché servono a scopi diversi.

Conosce OOP? In OOP, oggetti statici o membri di una class a cui è ansible accedere direttamente dalla class, mentre ai membri non statici è ansible accedere solo dall’istanza a cui appartiene.

C # segue un principio simile per i metodi. È ansible accedere ai metodi statici direttamente dalla class, mentre i metodi non statici (oi metodi di istanza come mi piace chiamarli) devono essere accessibili da un’istanza. Questo è il motivo per cui l’istatazione deve essere eseguita, ad esempio, per i metodi, mentre per i metodi statici non è semplicemente necessario, e inoltre non è pratico (vedi sotto).

In OOP, le variabili statiche vengono utilizzate per valori che non possono essere memorizzati da una variabile di istanza. Esempio: si suppone di voler tenere un conteggio del numero di istanze di una class esistente? Come lo memorizzerai in una singola istanza?

I metodi usano un principio simile. Dovrebbero essere usati per procedure per le quali non è pratico fare all’interno di un’istanza di una class. Io tendo ad usarli per le procedure generali (non un termine tecnico), intendendo quelle che non mi richiedono di istanziare un object. Esempio, aggiungendo due parametri. (Questo uso può o non può essere corretto, ma credo che lo sia)

Tuttavia, se si desidera aggiungere due proprietà di un object, il metodo non può essere statico, poiché, come ben presto si renderà conto, i metodi statici non possono accedere a metodi o variabili di istanza all’interno di una class. Ovviamente questo ha senso perché quel metodo statico non saprebbe quale istanza della class ottenerli a meno che non sia stata detta, dato che non fa parte di un’istanza stessa)

Per non complicare ulteriormente le cose, mi fermerò qui. Fammi sapere se hai frainteso qualcosa.

La tua scelta dipende dalla tua architettura.

Static fa parte di un Tipo , altri fanno parte di un’istanza di quel tipo. Se si desidera avere uno stato condiviso (ad esempio) tra istanze diverse dello stesso tipo, utilizzare static . Se si desidera che ogni istanza abbia il proprio valore, indipendente dagli altri, utilizzare i campi di instance .

In entrambi i casi, comunque, evitare di esporre come un fields pubblico, ma usare le proprietà.

Sono completamente d’accordo con Mr Oded :

Se, in tutte le istanze della class, questa variabile deve essere identica, utilizzare una variabile statica.

In caso contrario, utilizzare una variabile di istanza.

Sì, aggiungere static a un membro della class significa fondamentalmente che puoi accedervi senza un’istanza e solo all’esterno di ogni istanza. E sì, diventa una risorsa globale , o anche una variabile globale, se vuoi.

Ma penso che ci sia almeno un altro ( pesantemente modificato ) buon punto di essere cameriera qui …

L’utilizzo di membri statici come vars globali va contro OOP

Ciò significa che una volta impostato un membro statico non è ansible passarlo come object. Più si usa statica come variabile globale, più è difficile per le classi di test unitario / simulazione .

C’è una soluzione per questo, Singletons . Ma non dovrebbero mai venire senza avvertimenti !

D’altra parte, se sei sicuro di aver davvero bisogno di vars globali, dai un’occhiata al pattern Toolbox . È un’estensione poco conosciuta del modello Singleton. È così sconosciuto, infatti, se cerchi google, non lo troverai con quelle parole chiave ( pattern toolbox ).

Quindi pianificare in anticipo. Leggi di più. Informati su ogni opzione in modo da poter decidere meglio. Anche prendere un libro. La programmazione orientata agli oggetti consiste nell’applicare concetti che aiuteranno a lungo termine piuttosto che far funzionare le cose subito.

In generale, se si desidera avere una variabile pubblica, statica o istanza, è necessario inserirla in una proprietà ed esporla in questo modo. Questo è sicuramente un principio che amerai seguire.

Ma nonostante alcune delle altre risposte non posso dire di non usare l’elettricità statica. Statico non è il diavolo che dovresti evitare in ogni caso. Quello che devi fare deciderà se utilizzerai o meno l’elettricità statica, a patto che tu mantenga il programma pulito e di facile manutenzione.

Facilmente parlando, e non nella lingua degli anziani, statico sta per qualcosa che non appartiene a nessuna istanza di questa class, ma ha un effetto su di loro. Un esempio di una proprietà statica in una class che genera istanze è ad esempio un fattore, che dovrebbe essere globale per tutte le istanze della class, per prendere parte a un calcolo eseguito all’interno delle istanze. In questo caso, e secondo me, è meglio avere questo fattore dichiarato come statico piuttosto che averlo in ogni singola istanza. Soprattutto se questo fattore cambia nel corso della vita del tuo programma per influenzare il prossimo calcolo.

Hai bisogno di fare una domanda a te stesso: perché ho bisogno di x per essere statico?

Se si crea x static significa che x è una parte di tutti gli oggetti di class A, ma quando x non è statico significa che x è una parte di un solo object.

In geleral l’uso di campi statici è doloroso per il tracciamento dei bug, ma in alcuni casi questo è molto utile.

Ti suggerisco di guardare usando singelton http://en.wikipedia.org/wiki/Singleton