一開始,,大家使用 & 和換行符 _ 來連接字符串,,呃,,后來程序員們覺得這太荒唐了,于是出現(xiàn)了高級一些的用法,,例如StringBuilder(經(jīng)常被我簡寫成sb),。即便如此,VB.net的多行字符串還是無法做到像C#一樣的簡潔與高可讀性:
- string query = @"SELECT first, last
- FROM table
- WHERE id = 1";
VB.NET的IDE包括編譯器很“自然”地不支持這些特性,,原因嘛,,簡單來說,就是VB.NET沒有分號,。由大量的連接符和換行符(甚至還有vbCrLf和ControlChars.NewLine)組成的多行字符串使代碼非?;靵y而且使可讀性變得很低,導(dǎo)致很長一段時間VB程序員們非常羨慕C#程序員,,呃,,至少在這個方面是。
舉個栗子,?這里有一個:
- Dim sourceText As String =
- "Imports Microsoft.VisualBasic" & vbNewLine &
- "Imports System" & vbNewLine &
- "Imports System.Collections" & vbNewLine &
- "Imports Microsoft.Win32" & vbNewLine &
- "Imports System.Linq" & vbNewLine &
- "Imports System.Text" & vbNewLine &
- "Imports Roslyn.Compilers" & vbNewLine &
- "Imports System.ComponentModel" & vbNewLine &
- "Imports System.Runtime.CompilerServices" & vbNewLine &
- "Imports Roslyn.Compilers.VisualBasic" & vbNewLine &
- vbNewLine &
- "Namespace HelloWorld" & vbNewLine &
- " Module Program" & vbNewLine &
- " Sub Main(args As String())" & vbNewLine &
- " Console.WriteLine(""Hello, World!"")" & vbNewLine &
- " End Sub" & vbNewLine &
- " End Module" & vbNewLine &
- "End Namespace"
至于你暈不暈,,反正我是暈了......
嗯
漫長的冬天持續(xù)了很長時間,直到XML Literal的出現(xiàn)
什么是XML Literal呢,?
"XML Literal"是在VB.NET 9.0引入的一個用于構(gòu)建XML對象的新特性,。VB.NET有了如此神器,現(xiàn)在輪到C#程序員羨慕了,。當(dāng)然這篇文章不是說如何使用XML Literal的,,關(guān)于這個新特性的更多信息可以參考MSDN:
http://msdn.microsoft.com/en-us/library/bb384629.aspx
有了XML Literal之后,我們?nèi)绾斡盟鉀QVB.NET中多行字符串的問題呢,?來看示例:
- Dim sourceText As String =
- <string>
- Imports Microsoft.VisualBasic
- Imports System
- Imports System.Collections
- Imports Microsoft.Win32
- Imports System.Linq
- Imports System.Text
- Imports Roslyn.Compilers
- Imports System.ComponentModel
- Imports System.Runtime.CompilerServices
- Imports Roslyn.Compilers.VisualBasic
- Namespace HelloWorld
- Module Program
- Sub Main(args As String())
- Console.WriteLine("Hello, World!")
- End Sub
- End Module
- End Namespace
- </string>
對比一下前面的代碼,,有沒有發(fā)自內(nèi)心的想說出“我靠”兩個字?
經(jīng)過試驗(yàn),,代碼中的<string>不是必須叫"string"的,,你也可以改成<字符串></字符串>,呃,,如果你喜歡的話,。原理嘛,就是編譯器將代碼中的xml片段轉(zhuǎn)換成了XElement,,所以名字并不重要,。
如果你喜歡類型推斷,也可以用這種形式:
- Dim sourceText =
- <string>
- Imports Microsoft.VisualBasic
- Imports System
- Imports System.Collections
- Imports Microsoft.Win32
- Imports System.Linq
- Imports System.Text
- Imports Roslyn.Compilers
- Imports System.ComponentModel
- Imports System.Runtime.CompilerServices
- Imports Roslyn.Compilers.VisualBasic
- Namespace HelloWorld
- Module Program
- Sub Main(args As String())
- Console.WriteLine("Hello, World!")
- End Sub
- End Module
- End Namespace
- </string>.Value
比較明顯的變化就是沒有了As String的顯式類型聲明,,然后后面調(diào)用.Value屬性以確定這個變量確實(shí)是字符串,。實(shí)際上與上面代碼相比,這兩段代碼在編譯、運(yùn)行時并沒有什么區(qū)別,。也許第二種更漂亮些?
有的時候,,多行字符串存在的意義就是把他們顯示在窗口,、控制臺或者M(jìn)sgBox中,不知你發(fā)現(xiàn)沒有,,上面的XML片段中的多行字符串.....都是有超級多的前置空格的(為了保持代碼伸縮性,,看起來也漂亮,主要原因其實(shí)是XML文本并不關(guān)心空格的多少),。
不過我敢肯定,,實(shí)際上你并不需要這么多沒有用的空格。那怎么樣去掉這些空格呢,?這個并沒有什么現(xiàn)成的辦法,,所以說,最后呢,,at last,,歸根結(jié)底,你需要做的事情只有一個——把空格們都刪掉:
- Dim sourceText = <string>Imports Microsoft.VisualBasic
- Imports System
- Imports System.Collections
- Imports Microsoft.Win32
- Imports System.Linq
- Imports System.Text
- Imports Roslyn.Compilers
- Imports System.ComponentModel
- Imports System.Runtime.CompilerServices
- Imports Roslyn.Compilers.VisualBasic
- Namespace HelloWorld
- Module Program
- Sub Main(args As String())
- Console.WriteLine("Hello, World!")
- End Sub
- End Module
- End Namespace</string>.Value