vbCrLf

在 .NET 刚刚推出的时候,VB作为一款被微软用来“衬托”C#的语言,在许多细节设计上远不如C#方便。
比如在C#中写一个多行文本,就有各种方式:
string s1 = "我是一个多行文本\n这是第二行";

string s2 = @"我是一个多行文本
这是第二行";

string s3 = 
@"我是一个多行文本
这是第二行";
可以看出C#在字符的赋值写法上十分灵活多变,然而你若是想用VB写一个多行文本,那可废了老劲了:
Dim s1 As String = "我是一个多行文本" & vbCrLf & "这是第二行"

Dim s2 As String = "我是一个多行文本" & vbCrLf & _
"这是第二行"

Dim s3 As String = _
"我是一个多行文本" & vbCrLf & _
"这是第二行"
因为VB没有转义符,而且当时的VB也不支持字符串内的换行功能,所以只能采用 vbCrLf 来连接字符。
如果想要连接下一行的代码,还需要在行末添加一个 _ 字符,十分的繁琐!

可是别忘了,现在都9102年了,VB早已经克服了不支持多行文本的缺点!
让我们看看现在如何利用VB的语法来定义多行文本吧!

VS语法糖

首先,请先确定你所使用的VS版本,只要版本够新的话,VS的IDE就自动具备了多行文本的智能连接功能,所以下面的代码是可以直接运行的!
Dim s As String =
"我是一个多行文本
这是第二行"

MsgBox(s)
然而需要注意的是,这种语法只是VS的语法糖而已,并不是合法的VB代码!
你利用上面的代码用VBC的编译器是无法编译完成的,所以我还将介绍另一个更神奇的多行文本方法!

String Tag

下面的方法仅适用于 .NET 3.5 以后的平台,低于该版本的.NET无法编译与识别。

代码如下:
Dim s As String = <string>我是一个多行文本
这是第二行</string>

MsgBox(s)
只需将字符串的声明符号 "..." 换成 <string>...</string> 这个XML标签,即可让我们的VB代码支持多行文本!
需要注意的是,被 <string> 包裹的内容是包含空白符的,所以不要留下多余的空格与空行。
内部的文本支持HTML转义符,所以 < 符号需要以 &lt; 表示,> 需要以 &rt; 来表示。

XML中的转义符
字符转义符
<&lt;
>&gt;
&&amp;
'&apos;
"&quot;
(其中只有 <& 是非法字符,需要严格转义,但还是建议您将其他符号也一并转义。)

如果你的文本中包含大量需要转义的字符,则可以直接使用 XML CDATA 来包覆文本
Dim s As String = <string><![CDATA[&我是一个多行文本&
<我么得感情!>]]></string>

Msgbox(s)
其中被CDATA所包裹的文本可以自由使用各种需要转义的特殊字符,除了结尾的]]>之外!

LINQ XML

最后的最后,再来介绍一个小技巧:
' 定义一个结构原型
Structure xtag
    Sub New(ByVal p As String, ByVal c As String)
        Me.prop = p
        Me.cont = c
    End Sub
    Dim prop As String
    Dim cont As String
End Structure


Dim xtags As xtag() = {New xtag("属性", "内容"), New xtag("test", "hello world")}
' 创建一个LINQ XML元素
Dim linqxml As Xml.Linq.XElement =
 <xml>
     <title>内嵌XML对象演示</title>
     <%= From x In xtags
         Select <xtag type=<%= x.prop %>><%= x.cont %></xtag>
     %>
     <endtag>结束XML</endtag>
 </xml>

MsgBox(linqxml.ToString)
原来在VB.NET中的XML标签(并非一定得是xml作为根标签)可以直接定义一个Linq.XElement对象,而且其内部可以利用LINQ + ASP.NET的语法对元素进行操作和赋值,十分的方便!

输出的内容
<xml>
  <title>内嵌XML对象演示</title>
  <xtag type="属性">内容</xtag>
  <xtag type="test">hello world</xtag>
  <endtag>结束XML</endtag>
</xml>