C#中靜態成員、靜態方法、靜態類

平時在用C#做開發的朋友都知道,不論是靜態成員還是靜態方法還是靜態類都是用static關鍵字來修飾。

C#中靜態成員、靜態方法、靜態類

static關鍵字

也就是說只要看到了static,那麼它後面的東西就是靜態!在c#中,靜態成員或者靜態方法是屬於類的,不是屬於對象。假如我們有一個類MyClass,需要實例化這個 類,就應該這麼做:

MyClass myclass = new MyClass();

在這裡,MyClass是類,myclass是對象。如果這個類中有個靜態方法static SayHello(),我們調用的時候就應該寫成:

MyClass.SayHello();

還記得我們寫的第一個程序“Hello World"嗎? 仔細一看就會發現,原來Main()方法就一個靜態方法。

C#中靜態成員、靜態方法、靜態類

經典的Hello World

Main()方法在Program類中,它是程序的入口點。那麼Main()方法為什麼要是靜態的呢?因為操作系統在調用我們寫的程序運行時,首先要找到程序入口點Main()方法,如果Main()方法不是靜態的,那麼這個方法是屬於對象的,也就意味著在調用Main()之前需要先實例化Program類的一個對象,再用對象來調用。那麼問題來了,程序入口都進不去,怎麼來實例化對象呢?程序無法運行了。所以需要把Main()方法設置為靜態方法,這樣操作系統在調用這個方法時不需要實例化對象,直接通過類名Program來調用Main()方法即可。

其實上面我們用到的WriteLine() ReadKey()都是靜態方法,它們是屬於Console類的,而且Console就是一個靜態類!

接下來做幾個測試:

在Program類中添加一個方法SayHello(),然後在Main()方法中調用它

C#中靜態成員、靜態方法、靜態類

靜態方法中調用非靜態方法

我們發現SayHello()下面有紅色波浪線條,並提示有錯誤: 非靜態的字段、方法或屬性“ConsoleApplication1.Program.SayHello()”要求對象引用。因為我剛剛寫的SayHello()方法不是靜態的,非靜態方法是屬於對象的。而Main()方法是靜態方法,調用一個非靜態方法,我們就得實例化一個對象來調用它,需要修改成這樣才可以:

Program myprogram = new Program();

myprogram.SayHello();

或者我們將SayHello()方法改為靜態方法,在方法名前面加上static關鍵字。

在Program類前加上static,讓Program類變成靜態類

C#中靜態成員、靜態方法、靜態類

靜態類

我們發現又有錯誤了,

錯誤 1 無法聲明靜態類型“ConsoleApplication1.Program”的變量

錯誤 2 無法創建靜態類“ConsoleApplication1.Program”的實例

哦,原來是因為我在Program類名前加了static 那麼Program類就成為了一個靜態類。靜態類是不可以被實例化的,而且靜態類中只能有靜態方法或者靜態成員。SayHello()是一個實例成員,它是不可以在靜態類中聲明的,所以我們再修改一下,變成下面這樣:

C#中靜態成員、靜態方法、靜態類

靜態類 靜態方法

現在編譯運行正常了。

接下來簡單介紹幾個微軟提供給我們的常用靜態類

  1. Console類
  2. File類
  3. Environment類

Console類、Environment類就不說了,來看一下File類幾個常用的靜態方法:

public static string ReadAllText(string path)//讀取文本文件的所有內容

public static StreamReader OpenText(string path)//打開一個文本文件返回一個流

public static StreamWriter CreateText(string path)//創建一個文件返回一個寫入流

public static void Copy(string sourceFileName, string destFileName)//拷貝文件

public static void WriteAllLines(string path, IEnumerable<string> contents, Encoding encoding)/<string>

//寫入所有的行
public static void WriteAllText(string path, string contents)//寫入所有的內容

public static byte[] ReadAllBytes(string path)//讀取所有的字節

這些靜態方法在平時是經常用?用起來是不是很爽?直接用類名File調用靜態方法飛起!


分享到:


相關文章: