2010-10-01 164 views
5

這絕對是一個小菜鳥問題,但我的搜索如此遠遠沒有解決我的問題。c#:(靜態)班級變量

想要一個特定的控制檯應用程序來存儲幾個類級變量。在一種情況下,我想存儲我的日誌記錄對象的副本,我將在課程中的各個地方使用它。在另一種情況下,我想存儲一個簡單的類型,實際上是一個只能在內部使用的int值(不需要是屬性)。

看來,除非我將這些變量指定爲靜態,否則我不能在Main()中使用它們。

我對靜態對象的理解是,它們的值在對象的所有實例中共享。在正常的操作下,我希望他們只是我的應用程序的一個實例,所以這個問題不是問題 - 但它突出了我對相當基本的東西缺乏瞭解。

在我的日誌記錄對象的情況下,我可以看到使它靜態的情況 - 跨多個實例共享日誌可能會帶來好處。然而,情況可能並非如此......就我的int而言,我絕對不希望這種情況在實例間共享。

所以......

  • 我誤解這背後的原理是什麼?
  • 是否有不同的方式我應該聲明和使用我的類級變量?
  • 我應該避免使用它們嗎?我可以簡單地將值作爲參數從函數傳遞給函數,但對於沒有明顯收益的工作來說似乎很少。

編輯:好的,消息很清楚 - 我對靜力學的理解基本上是正確的,但問題是結構和方法之一。感謝您的回覆。

+0

不完全和答案,但檢查了這一點:http://en.wikipedia.org/wiki/Singleton_pattern – Brad 2010-10-01 13:21:47

+0

你的主()方法是靜態的,這就是爲什麼你只能從中訪問靜態方法和變量。 – 2010-10-01 13:25:03

+3

靜態變量在AppDomain *內的對象的所有實例*之間共享。您的應用程序的每個實例都位於不同的AppDomain中。 – Douglas 2010-10-01 13:30:36

回答

9

只是封裝在另一個類的應用程序,您創建和執行上Main方法:

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

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

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

您仍然可以,如果你想在日誌現場靜。

+1

+1和[「全局變量不好」](http://c2.com/cgi/wiki?GlobalVariablesAreBad)在解釋爲什麼值得遇到麻煩方面做了很好的工作。 – 2010-10-01 13:25:22

3

您應該在Main函數之外創建一個類,然後在Main中創建該類的實例。

EG

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

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

這裏的問題或多或少都是純粹的語法:因爲靜態方法只能訪問靜態字段,且方法必須是靜態的,所以這需要使用的變量是靜態的。您從不創建MyConsoleApp類的實例。

並不是真正意義上的理論在這裏,只有務實的要求......

托馬斯