2010-10-01 17 views
5

To jest zdecydowanie trochę noob pytanie, ale moje wyszukiwania tak daleko nie wyjaśniły problemu dla mnie.C#: (Statyczne) Zmienne poziomu klasy

Chcesz konkretnej aplikacji konsolowej do przechowywania kilku zmiennych na poziomie klasy. W jednym przypadku chcę zapisać kopię mojego obiektu do rejestrowania, którego użyję w różnych miejscach w klasie. W innym przypadku chcę zapisać prosty typ, wartość int, która będzie używana tylko wewnętrznie (nie musi być własnością).

Wygląda na to, że jeśli nie określiłem tych zmiennych jako statyczne, nie mogę ich użyć w menu głównym() i poza nim.

Moje rozumienie obiektów statycznych polega na tym, że ich wartości są współużytkowane we wszystkich instancjach obiektu. W normalnych warunkach, spodziewam się, że będą one tylko jednym przypadkiem mojej aplikacji, więc ten problem nie stanowi problemu - ale podkreślił brak zrozumienia z mojej strony czegoś, co jest dość podstawowe.

W przypadku, z mojego obiektu rejestrowania, mogłem zobaczyć przypadek dla uczynienia go statycznym - udostępnianie dziennika w wielu wystąpieniach może być zaletą. Jednak może nie być tak w przypadku ... W przypadku mojej int, z pewnością nie chciałbym, aby to było współdzielone przez instancje.

Więc ...

  • jestem nieporozumienie teorię tego?
  • Czy jest inny sposób, w jaki powinienem deklarować i używać zmiennych na poziomie klasy?
  • Czy powinienem unikać ich używania? Mógłbym po prostu przekazać wartości jako parametry od funkcji do funkcji, choć wydaje się niewiele do pracy bez widocznego zysku.

EDYCJA: OK, wiadomość jest jasna - moje rozumienie statyki było w dużej mierze poprawne, ale problem był związany ze strukturą i podejściem. Dzięki za twoje odpowiedzi.

+0

Niezupełnie i odpowiedź, ale to sprawdzić: http://en.wikipedia.org/wiki/Singleton_pattern – Brad

+0

głównego Metoda() jest statyczna, dlatego można uzyskać dostęp tylko do statycznych metod i zmiennych z niej. –

+3

Zmienne statyczne są udostępniane we wszystkich instancjach obiektu * w ramach AppDomain *. Każda instancja aplikacji działa w innym AppDomain. – Douglas

Odpowiedz

9

Wystarczy hermetyzacji aplikację w innej klasy, której tworzenie i wykonywanie na metodzie Main:

class MyApp { 
    private MyLog lol = new MyLog(); 
    private int myInt = 0; 

    public void Execute() { 
    // ... 
    } 
} 

class Program { 
    public static void Main() { 
    new MyApp().Execute(); 
    } 
} 

można nadal pole log statyczny, jeśli chcesz.

+1

+1 i ["Globalne zmienne są złe"] (http://c2.com/cgi/wiki?GlobalVariablesAreBad) dobrze wyjaśniają, dlaczego warto podejmować się problemów. –

3

Powinieneś tworzyć klasę poza główną funkcją, a następnie tworzyć instancję tej klasy z poziomu głównego.

EG

class MyConsoleApp 
{ 
    public static void Main() 
    { 
     MyClass mc = new MyClass(); 
    } 
} 

Class MyClass 
{ 
    private MyLog lol as new MyLog(); 
    private int myInt = 0; 
} 
2

Problem jest mniej lub bardziej czysto syntaktyczny: ponieważ metoda statyczna może uzyskać dostęp tylko do pól statycznych, a metoda Main() musi być statyczna, wymaga to, aby używane zmienne były statyczne. Nigdy nie tworzysz instancji klasy MyConsoleApp.

Nie bardzo dużo teorii tutaj, tylko wymagania pragmatyczne ...

Thomas

Powiązane problemy