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>

===

本文首发于