2010-12-22 40 views
4

我正在學習C#,並且無法理解static關鍵字。瞭解C#中的靜態內容#

說我有以下代碼:

using System; 
using System.IO; 
using System.IO.Ports; 

class PortThing 
{ 
    SerialPort port; 

    void InitPort() 
    { 
     if(!File.Exists("/dev/whatever")) 
     { 
      System.Console.WriteLine("Device not found.");  
      port = null; 
     } 
     //else port = something 
    } 

    public static void Main(string[] args) 
    { 
     InitPort(); 
     System.Console.WriteLine("Done."); 
    } 
} 

據我可以理解,一個靜態方法是一個屬於類而不是該類的對象。所以靜態方法不能引用非靜態方法/字段,因爲它們需要實例化一個類。

編譯器抱怨Main()調用InitPort()並希望使其成爲靜態。我可以這樣做,但這需要使port成爲一個靜態字段。遵循這一思路,一切都將最終成爲靜態的。

我得到什麼錯誤?

回答

10

你說得對。靜態方法只能訪問靜態成員。非靜態成員需要該類的實例才能訪問它們。所以,你可以這樣做:

public static void Main(string[] args) 
{ 
    new PortThing().InitPort(); 
    System.Console.WriteLine("Done."); 
} 

這樣你正在呼籲給定的類實例的實例方法InitPort,你可以保持在port場非靜態。

+0

所有靜態成員...不只是靜態字段 – 2010-12-22 13:06:36

3
public static void Main(string[] args) 
{ 
    PortThing pt = new PortThing(); 
    pt.InitPort(); 
    System.Console.WriteLine("Done."); 
} 
2

你沒有得到任何錯誤。

這裏的問題是Main在普通的類中不需要是static。它在這裏需要是靜態的,因爲它爲您的程序提供了入口點。換句話說,你需要有一個方法來運行,但是你不能在運行之前創建一個對象,所以這個方法必須是static

沒有什麼妨礙你真正創造PortThing類的對象,通常使用它:

public static void Main(string[] args) 
{ 
    var pt = new PortThing(); 
    pt.InitPort(); 
    System.Console.WriteLine("Done."); 
} 
1

你說正確的:一個靜態方法屬於類而不是對象。

但在這種情況下,如果你不想讓一切靜態,你可以簡單地創建類型PortThing的對象,換句話說,實例化這個類,並調用非靜態方法。

或者,如果非靜態方法不訪問任何類屬性,至少非靜態的,你可以把靜態的。

0

靜態方法和變量不包含類的實例。

瞭解靜態變量,最重要的是,只有一個變量每個進程的實例(更準確的AppDomain,但大多數的過程只有1 AppDomain中)。我認爲靜態變量是全局變量。您可以創建一個類的靜態構造函數來初始化這些靜態變量。當該類首次被訪問時,靜態構造函數被調用一次。但要注意的有關訪問和修改靜態成員,尤其是靜態的藏品多線程應用程序的併發問題!

靜態方法可以被認爲是C中的函數。它們可以在不創建任何對象的情況下被調用,這對於性能來說稍微好一些(但應該只在有意義的地方使用)。例如,我將在靜態工具類中實現方法int CountNumberOfCommas(string s)作爲靜態方法,因爲這是一個獨立於類的任何實例的操作。

你沒有做錯什麼。您只需在兩個選項中進行選擇:您可以創建一個Program的實例並調用InitPort,或者使InitPort靜態,而不是創建一個Program的實例。將所有東西都變成靜態的基本上和用C寫一個程序是一樣的,在這裏只定義函數。