C# 6:using static 陳述式

先前以為 C# 6 新增的引用靜態成員(using static)語法取消了,原來是誤會一場。這就來 update 一下....

在 C# 6 之前,只要有匯入(using)某類別所屬的命名空間,便可以使用「類別名稱.成員名稱」的語法來存取該類別的靜態成員。例如:

using System;      // 匯入 System 命名空間(的所有型別)
using System.IO;   // 匯入 System.IO 命名空間(的所有型別)

class BeforeCSharp6 
{
    void Demo()
    {
        Console.WriteLine("Hello!");
        File.WriteAllText(@"C:\test.txt", "Hello!");
    }
}

到了 C# 6,新增的 using static 陳述式可以讓存取靜態成員的寫法更簡潔。它的語法是:

using static 某型別名稱;

關鍵字 using static 本身已經揭示,其目的是要讓你更方便地「使用靜態成員」。說得更明白些,也就是匯入某型別的所有靜態成員,以便在目前的程式檔案中直接使用那些靜態成員,而無須指涉型別名稱。 於是,剛才的範例可以改寫成這樣:

using static System.Console;  // 匯入 System.Console 類別的所有靜態成員
using static System.IO.File;  // 匯入 System.IO.File 類別的所有靜態成員

class NewInCSharp6 
{
    void Demo()
    {
        WriteLine("Hello!");  // 省略類別名稱 "Console"
        WriteAllText(@"C:\test.txt", "Hello!"); // 省略類別名稱 "File"
    }
}

如你所見,當你需要在程式中大量存取某類別的靜態成員時,using static 可以讓你少打一些字。

不過,這個新口味的語法糖恐怕不見得人人都愛。怎麼說呢?

譬如 WriteLine 這類常見的方法,由於不只一個類別提供此方法,使用時可能會產生名稱衝突而導致編譯失敗。另一個可能的問題是,如果大量使用 using static 來匯入許多類別的靜態成員,雖然寫程式的時候可以少打一些字,但將來閱讀程式碼的時候可能會經常有疑問:這個靜態方法(或屬性)到底是屬於哪個型別?

然而在某些場合,省略類別名稱的寫法卻是同時兼具簡潔與易讀的優點。例如 Math 類別。試比照底下兩行程式碼的寫法:

var value1 = Math.Sqrt(Math.Sin(90) + Math.Cos(45)); // using System
var value2 = Sqrt(Sin(90) + Cos(45));     // using static System.Math 

第二行程式碼是使用了 using static 的寫法。就我的感覺,程式碼不僅更簡潔,而且不影響程式碼的理解,甚至還更容易閱讀了。
感覺是主觀的,但我想只要試寫個幾次,應該就能大概抓到一個原則:當靜態成員的名稱非常明確,一看就知道它的功用與所屬型別,而且不會有任何猶疑。有這種感覺,八成是用對地方了。
順便提及,由於 using static 作用的對象是型別(而不是命名空間),因此它還可以用來
限定只匯入某類別的擴充方法(extension methods),而不是像一般的 using 陳述式那樣匯
入某命名空間的全部擴充方法。當你在 C# 程式檔案中匯入了許多命名空間,而其中有兩
個命名空間碰巧包含了相同名稱的擴充方法,此時便可藉由 using static 匯入指定類別
的方式來嘗試解決名稱衝突的問題。

摘自《C# 本事》(alpha 版)

Post Comments

技術提供:Blogger.