2008年7月30日 星期三

VB 9.0 - 很屌的新功能 XML Literals

到底要學 VB.NET 還是 C#? 這個問題常常被拿出來討論,而討論的結果也常常沒有結論。因為大部分人要不直接推薦他們自己擅用的語言,就是叫你選自己覺得喜歡的。其實大家心理都知道,所有 .NET 語言 compile 出來都是變成 IL,硬要說 C# 比 VB.NET 強大其實有點牽強,兩個語言的相容性絕對是 95% 以上。所以所有的 .NET 語言其實都是平等的,.NET 平台強大的地方在於它的 CLR 跟 Class Library。最近看到了一篇很有意思的文章,裡面形容 VB.NET 為「醜小鴨」,其實一點也不為過。該文章提到說「C# 使用者總有一種模糊的感覺覺得自己在寫的程式碼是既優雅又帶有性格,一定是大括弧產生的錯覺。」,非常有意思。實際上 Visual Basic Expression 版的下載次數遠大於其他版本。還是覺得 VB.NET 是個「玩具語言」嗎?微軟的 Silverlight 裡面的 Javascript Parser 就是用 VB.NET 寫的,這證明了 VB.NET 的能耐絕對足以寫出非常專業的產品。總歸一句話,軟體寫的好不好主要還是看寫的人,使用個工具或語言其次。

好了廢話不多說,今天想來介紹一個 VB 9.0 有,但 C# 3.0 (就是 Visual Studio 2008 的 VB 跟 C# 版本) 沒有的功能 - XML Literals。簡單來講就是可以直接把 XML 打在程式碼裡面處理。表面上聽起來沒什麼了不起,但若你常需要處理 XML 檔案的話,用一次你就知道它的方便性,還有它的優雅。C# 看來不太可能會有這個功能,因為或多或少 C# 都是遵循 ANSI C 的規格,像在程式碼裡面添加 XML 這種怪招,C# 我想不大好去 Implement。廢話不多說先來看一個簡易範例,用 XML Literals 建立一個 XML 文件:

Dim xml = <books>

<book>

<title>Head First Java</title>

<price>800</price>

</book>

<book>

<title>Head First HTML</title>

<price>1000</price>

</book>

</books>

同樣的 XML 用 XmlDocument:

Dim xml As New XmlDocument

Dim booksNode As XmlNode = xml.AppendChild(xml.CreateElement("books"))

Dim bookNode As XmlNode = booksNode.AppendChild(xml.CreateElement("book"))

Dim titleNode As XmlNode = bookNode.AppendChild(xml.CreateElement("title"))

Dim priceNode As XmlNode = bookNode.AppendChild(xml.CreateElement("price"))

titleNode.InnerText = "Head First Java"

priceNode.InnerText = "800"

titleNode = bookNode.AppendChild(xml.CreateElement("title"))

priceNode = bookNode.AppendChild(xml.CreateElement("price"))

titleNode.InnerText = "Head First HTML"

priceNode.InnerText = "1000"

如何,用 XML Literals 的確優雅很多吧?它讓你在處理 XML 的時候,用一種非常視覺化的方式來處理,你的 XML 文件就在你眼前,不用去想像,甚至可以透過匯入 Schema 的動作來讓你的 XML Literal 支援 Intellisense

好建立一個 XML 文件其實只是牛刀小試,XML Literals 還支援 Embedded Expressions,用 <%= %> 來表示非常類似 ASP.NET 的,讓你可以非常快速的,而且視覺化的來動態產生/轉換 XML。下面是一個非常簡易的將上面的 XML Tranform 成 HTML 的範例:

Dim output = <html>

<head><title>Books</title></head>

<body>

<p>

<table>

<tr><td>書名</td><td>價錢</td></tr>

<%= From book In xml...<book> Select <tr><td><%= book.<title>.Value %></td><td><%= book.<price>.Value %></td></tr> %>

</table>

</p>

</body>

</html>

出來的結果就是:

image

非常神奇,不需要去玩 XSLT,也不用甚麼程式碼,直接在 XML Literal 裡面定義就好了。

XML Literal 的功能也還有一種另類的玩法 - 就是拿來當字串,尤其是多行的字串如 SQL 指令,還有用來取代 String.Format(),請看下面的範例:

舊寫法,用 & _

Dim str As String = "這是一段" & vbCrLf & _

"超過三行" & vbCrLf & _

"以上的" & vbCrLf & _

"文字"

MsgBox(str)


新寫法,乾淨許多

Dim xmlLitString = <string>

這是一段

超過三行

以上的

文字

</string>.Value

透過 Embedded Expression 的支援,就可以達到 String.Format() 的效果,但是直接寫在 XML Literal 碼裡面,不用一直加參數跟 placeholder:

舊方式,用 String.Format(),當你的參數越來越多的時候就會變的複雜,不好更新

Dim msg = String.Format("{0}! 現在是{1}" & vbCrLf & _

"你的登入帳號為 {2}" & vbCrLf & _

"電腦叫做 {3}" & vbCrLf & _

"作業系統為 {4}", If(Now.Hour > 9 Or Now.Hour < 4, "晚安", "你好"), Now.ToString(), My.User.Name, My.Computer.Name, My.Computer.Info.OSFullName)

MsgBox(msg)


新寫法,更改方便,不容易出錯

Dim xmlLitMsg = <string>

<%= If(Now.Hour > 9 Or Now.Hour < 4, "晚安", "你好") %>! 現在是<%= Now.ToString() %>

你的登入帳號為 <%= My.User.Name %>

電腦叫做 <%= My.Computer.Name %>

作業系統為 <%= My.Computer.Info.OSFullName %>

</string>.Value

MsgBox(xmlLitMsg)

講了這麼多主要還是想讓大家知道,VB.NET 是個成熟的 .NET 語言,功能上絕對不比 C# 遜色。感覺上使用 C# 的人好像比較多其實主要還是因為是很多人有 C/C++/Java 背景,這些人看熟 C 的語法了,自然對 C# 容易上手,沒有必要花時間去鑽研 VB.NET (雖然我知道很多高手兩個都很厲害),並不是因為 VB.NET 是個比較拙劣的語言。

其實現在 C# 跟 VB.NET 兩者都有很多很好資源,範例可以學習,在這裡還是奉勸大家兩個都學,才不會碰到找到一個解決你問題的範例但是看不懂的窘境。你可以比較熟一個,但至少另一個的基本語法也要看的懂。如果真的沒辦法,沒時間的話,至少有轉換器可以用 :-)。

沒有留言: