2013-01-13 12 views
9

Powiel możliwe:
Best way to make data (that may change during run-time) accessible to the whole application?Jak stworzyć globalny obiekt w C# biblioteki

Mam C# biblioteki.

  1. Czy biblioteka może mieć obiekty/zmienne globalne?
  2. Czy metoda inicjalizacji dla tych obiektów może być automatycznie wykonywana z biblioteki podczas uruchamiania głównego projektu lub czy muszę ją ustawić jako metodę statyczną i uruchomić ją z głównego projektu?
+1

Stan globalny jest zły. To sprawia, że ​​programy, które są trudne do zrozumienia i debugowania. – Oded

+1

@Dokładnie, prawda, ale czasami nie można tego uniknąć - wtedy bardzo jasne i przejrzyste jest bardzo ważne. – Hogan

Odpowiedz

17

W języku C# I zawsze używać statycznych klasy, aby zapewnić tę funkcjonalność. Klasy statyczne są szczegółowo omówione here, ale krótko zawierają one tylko elementy statyczne i nie są instancja - w zasadzie są one zmienne globalne i funkcje dostępne za pośrednictwem swojej nazwy klasy

Oto prosty przykład:

(i nazw).
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; 
    } 
} 

Uwaga, używam również inicjalizatora statycznego, który jest gwarantowany do uruchomienia w pewnym momencie, zanim jakiekolwiek elementy lub funkcje zostaną użyte/wywołane.

w innym miejscu programu można po prostu powiedzieć:

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

statyczne obiekty są tylko „stworzył” raz. Tak więc wszędzie, gdzie aplikacja korzysta, obiekt będzie pochodził z tej samej lokalizacji. Są z definicji globalne. Aby użyć tego obiektu w wielu miejscach, wystarczy odwołać się do nazwy obiektu i elementu, do którego chcesz uzyskać dostęp.


Możesz dodać statycznych członków do dowolnej klasy i będą one dostępne na całym świecie, ale myślę, że posiadanie jednego miejsca dla globaliów jest lepszym projektem.

7

Możesz użyć publicznego static properties dla klasy jako globalnych obiektów/zmiennych.

Można zainicjować właściwości statyczne w klasie static constructor, która zostanie wywołana bezpośrednio przed pierwszym uruchomieniem właściwości.

4

Czy biblioteka może mieć obiekty/zmienne globalne?

Tak C# może mieć klasy statyczne, statyczne elementy. Ale żadna zmienna nie może istnieć poza klasą.

Czy metoda inicjalizacji dla tych obiektów może być automatycznie wykonywana z biblioteki podczas uruchamiania głównego projektu lub czy muszę ją ustawić jako metodę statyczną i uruchomić ją z głównego projektu?

Można zainicjować inline lub wykonać inicjalizację w statycznych konstruktorach. Są one wywoływane przed pierwszym dostępem do statycznych członków lub członków instancji. Jeśli nie są dostępne statyczne elementy i instancje nie są tworzone, istnieje szansa, że ​​inicjalizacja nie nastąpi.

Interesting article related to static initializers