2013-01-13 14 views
9

Eventuali duplicati:
Best way to make data (that may change during run-time) accessible to the whole application?Come creare oggetto globale in una libreria C#

Ho una libreria C#.

  1. Una libreria può avere oggetti/variabili globali?
  2. Un metodo di inizializzazione per tali oggetti può essere eseguito automaticamente da una libreria quando si esegue il progetto principale oppure è necessario renderlo un metodo statico ed eseguirlo dal progetto principale?
+1

Lo stato globale è malvagio. Rende per i programmi che sono difficili da ragionare e fare il debug. – Oded

+1

@Oded, true ma a volte non è possibile evitarlo - quindi renderlo chiaro e trasparente è molto importante. – Hogan

risposta

17

In C# Io uso sempre un classi statiche per fornire questa funzionalità. classi statiche sono trattati in dettaglio here, ma per breve tempo contengono solo i membri statici e non sono istanziati - essenzialmente sono funzioni globali e le variabili accessibili tramite il nome della classe

Ecco un semplice esempio:

(e namespace.)
public static class Globals 
{ 
    public static string Name { get; set; } 
    public static int aNumber {get; set; } 
    public static List<string> onlineMembers = new List<string>(); 

    static Globals() 
    { 
     Name = "starting name"; 
     aNumber = 5; 
    } 
} 

Nota, sto anche utilizzando un inizializzatore statico che è garantito per essere eseguito ad un certo punto prima che vengano utilizzati/chiamati membri o funzioni.

Altrove nel programma si può semplicemente dire:

Console.WriteLine(Globals.Name); 
Globals.onlineMemeber.Add("Hogan"); 

oggetti statici sono solo "creato" una volta. Quindi ovunque l'applicazione utilizzi l'oggetto sarà dalla stessa posizione. Sono per definizione globali. Per utilizzare questo oggetto in più punti, è sufficiente fare riferimento al nome dell'oggetto e all'elemento a cui si desidera accedere.


È possibile aggiungere membri statici di qualsiasi classe e saranno disponibili a livello globale, ma penso che avere un posto per globali è un design migliore.

7

È possibile utilizzare il pubblico static properties su una classe come oggetti/variabili globali.

È possibile inizializzare le proprietà statiche in un static constructor per la classe, che verrà richiamata direttamente prima della prima volta che si accede alle proprietà.

4

Una libreria può avere oggetti/variabili globali?

Sì C# può avere classi statiche, membri statici. Ma nessuna variabile può esistere al di fuori della classe.

Un metodo di inizializzazione per tali oggetti può essere eseguito automaticamente da una libreria durante l'esecuzione del progetto principale oppure è necessario renderlo un metodo statico ed eseguirlo dal progetto principale?

O è possibile inizializzare inline o eseguire l'inizializzazione in costruttori statici. Vengono chiamati prima del primo accesso a membri statici o membri di istanze. Se non si accede ai membri statici e le istanze non vengono create, è possibile che l'inizializzazione non avvenga.

Interesting article related to static initializers