2010-03-24 17 views
5

Ho due oggetti che utilizzerò principalmente all'interno di una singola classe. Li inizializzerò all'inizio e li userò per tutta la durata del programma. Ora, la mia domanda è che se dovessi semplicemente crearli come variabili globali e accedervi da qualche parte nel codice (al lato della singola classe) o dovrei crearle come variabili locali e passarle come parametri ad altre funzioni. Voglio solo vedere quale sarebbe la migliore pratica di programmazione.Accesso globale vs. variabili locali

Sto usando C#.

Grazie.

risposta

5

In generale è necessario evitare le variabili globali. Se sarà pratico, ti consiglio di tenerli come locali e di passarli come parametri alle tue funzioni.

Come Josh sottolineato, se queste variabili sono solo utilizzato all'interno di una singola istanza della classe, allora si dovrebbe solo renderli privati ​​(o protette) i membri di quella classe e da fare con esso. Ovviamente, possono essere passati solo come parametri ad altri metodi con lo stesso livello di accesso (IE, privato).

In alternativa, è possibile considerare l'utilizzo dello Singleton Design Pattern, che è leggermente più pulito (e preferibile) per l'utilizzo di globals.

+0

Ho capito che dovresti evitare l'uso di globals, e io uso sempre Singleton, ma come si possono creare variabili globali in un .NET? – Merritt

+0

È possibile definire una variabile 'Public Static' string/int/float/etc, che sarebbe effettivamente globale. Ma d'accordo, non c'è davvero un concetto "globale" in C# rispetto ad altri linguaggi come C. Forse avrei dovuto essere più chiaro a riguardo nella mia risposta. –

+0

.Net supporta variabili globali e persino metodi globali. Ma la sintassi per C# non lo fa (questa è probabilmente una buona cosa.) –

2

Se l'ambito degli oggetti è la durata della classe in cui vengono istanziati, devono essere variabili membro privato.

Se non mantengono lo stato, devono essere classi statiche.

È necessario ancora passarli come variabili o almeno creare accessors di proprietà per ottenere nel campo di supporto. In questo modo puoi modificare i dettagli di implementazione senza far esplodere il tuo codice.

SOLID design principles sono un buon punto di partenza quando si pensa a queste cose.

0

Se gli oggetti saranno gli stessi per ogni istanza della classe poi

static const double PI = 3.14158; 
0

generale dovreste utilizzare metodi di accesso (ad esempio getter e setter) e mantenere le variabili interne privato. In questo modo il resto del codice, al di fuori della tua classe, non dipende dalle tue variabili effettive.

Vedere il tutorial this.

0

Se la classe dipende da questi 2 oggetti, è probabile che siano membri della classe stessa. Qualcosa di simile a questo (dove A è la classe che si sta parlando e B è uno degli oggetti si inizializza:

public class A 
{ 
    private B _b; 

    public A(B b) 
    { 
     _b = b; 
    } 

    public void DoSomething() 
    { 
     //do something with _b; 
    } 

    private void DoSomethingElse() 
    { 
     //do something else with _b; 
    } 
} 

In questo esempio A è dipendente da B (quindi si passa l'istanza di B nel costruttore di A o attraverso alcuni Dependency Injection quadro). non avrebbe molto senso per ogni metodo su classe A ad avere bisogno di un parametro di tipo B da passare ad esso.

2

ho due oggetti che sarò utilizzare principalmente all'interno della singola classe.I li inizializzerà all'inizio e li userà per tutta la durata del programma.

Questo suona come un momento perfetto per utilizzare una variabile private static readonly. Questi possono essere inizializzati nella loro dichiarazione, oppure è possibile creare un costruttore statico per inizializzarli.

Il fatto che si fa riferimento solo a questi oggetti all'interno di una singola classe è il punto chiave. Esistono altri modi migliori di fare le cose se questi oggetti sono mai necessari al di fuori della singola classe.

0

Penso che in questo caso dovresti chiedere cosa ha più senso. Esiste una sorta di relazione tra i 2 oggetti e la nuova classe. Inoltre, quanto spesso vengono utilizzati nella classe.

In genere, se solo un paio di metodi utilizzano gli oggetti, passarli altrimenti, istanziali come variabili di livello di classe (possibilmente utilizzando statico privato readonly come suggerisce Jefferey) e utilizzarli nella classe. Rendere il codice più leggibile dovrebbe essere il tuo obiettivo qui.