先前以為 C# 6 新增的引用靜態成員(using static)語法取消了,原來是誤會一場。這就來 update 一下....
在 C# 6 之前,只要有匯入(using)某類別所屬的命名空間,便可以使用「類別名稱.成員名稱」的語法來存取該類別的靜態成員。例如:
到了 C# 6,新增的 using static 陳述式可以讓存取靜態成員的寫法更簡潔。它的語法是:
關鍵字 using static 本身已經揭示,其目的是要讓你更方便地「使用靜態成員」。說得更明白些,也就是匯入某型別的所有靜態成員,以便在目前的程式檔案中直接使用那些靜態成員,而無須指涉型別名稱。 於是,剛才的範例可以改寫成這樣:
如你所見,當你需要在程式中大量存取某類別的靜態成員時,using static 可以讓你少打一些字。
不過,這個新口味的語法糖恐怕不見得人人都愛。怎麼說呢?
譬如 WriteLine 這類常見的方法,由於不只一個類別提供此方法,使用時可能會產生名稱衝突而導致編譯失敗。另一個可能的問題是,如果大量使用 using static 來匯入許多類別的靜態成員,雖然寫程式的時候可以少打一些字,但將來閱讀程式碼的時候可能會經常有疑問:這個靜態方法(或屬性)到底是屬於哪個型別?
然而在某些場合,省略類別名稱的寫法卻是同時兼具簡潔與易讀的優點。例如 Math 類別。試比照底下兩行程式碼的寫法:
第二行程式碼是使用了 using static 的寫法。就我的感覺,程式碼不僅更簡潔,而且不影響程式碼的理解,甚至還更容易閱讀了。
限定只匯入某類別的擴充方法(extension methods),而不是像一般的 using 陳述式那樣匯
入某命名空間的全部擴充方法。當你在 C# 程式檔案中匯入了許多命名空間,而其中有兩
個命名空間碰巧包含了相同名稱的擴充方法,此時便可藉由 using static 匯入指定類別
的方式來嘗試解決名稱衝突的問題。
摘自《C# 本事》(alpha 版)
在 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 版)
沒有留言: