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>

===

本文首发于 https://blog.clso.fun/posts/2019-04-23/vb-net-multi-line-string.html

VB.NET 定义多行文本字符的几种方式的更多相关文章

  1. Java的IO操作中有面向字节(Byte)和面向字符(Character)两种方式

    解析:Java的IO操作中有面向字节(Byte)和面向字符(Character)两种方式.面向字节的操作为以8位为单位对二进制的数据进行操作,对数据不进行转换,这些类都是InputStream和Out ...

  2. PHP如何实现数据类型转换(字符转数字,数字转字符)(三种方式)

    PHP如何实现数据类型转换(字符转数字,数字转字符)(三种方式) 一.总结 一句话总结: 1.强制转换:(int) (bool) (float) (string) (array) (object) 2 ...

  3. Spring Boot 定义系统启动任务,你会几种方式?

    在 Servlet/Jsp 项目中,如果涉及到系统任务,例如在项目启动阶段要做一些数据初始化操作,这些操作有一个共同的特点,只在项目启动时进行,以后都不再执行,这里,容易想到web基础中的三大组件( ...

  4. char wchar 互转 多字符 宽字符 的N种方式

    1:  用 CString  如果没有mfc 可以用 ATL 中的 CString  #include <atlstr.h>     CStringA v1 = "111&quo ...

  5. PHP定义字符串的四种方式

    1.简介 在PHP中这门语言中,因为是弱类型语言,因此使用变量时不需提前定义即可使用. 我们在使用php进行开发的时候,大多数使用双引号.单引号进行定义字符串.既然有这两种方式,那么他们之间肯定是有区 ...

  6. javaScript中定义类或对象的五种方式

    第一种方式: 工厂方法 能创建并返回特定类型的对象的工厂函数(factory function). function createCar(sColor){ var oTempCar = new Obj ...

  7. js replace 全局替换 以表单的方式提交参数 判断是否为ie浏览器 将jquery.qqFace.js表情转换成微信的字符码 手机端省市区联动 新字体引用本地运行可以获得,放到服务器上报404 C#提取html中的汉字 MVC几种找不到资源的解决方式 使用Windows服务定时去执行一个方法的三种方式

    js replace 全局替换   js 的replace 默认替换只替换第一个匹配的字符,如果字符串有超过两个以上的对应字符就无法进行替换,这时候就要进行一点操作,进行全部替换. <scrip ...

  8. Javascript定义类(class)的三种方法

    将近20年前,Javascript诞生的时候,只是一种简单的网页脚本语言.如果你忘了填写用户名,它就跳出一个警告. 如今,它变得几乎无所不能,从前端到后端,有着各种匪夷所思的用途.程序员用它完成越来越 ...

  9. JavaScript学习12 JS中定义对象的几种方式

    JavaScript学习12 JS中定义对象的几种方式 JavaScript中没有类的概念,只有对象. 在JavaScript中定义对象可以采用以下几种方式: 1.基于已有对象扩充其属性和方法 2.工 ...

随机推荐

  1. HTML5-canvas1.0

    HTML5 <canvas> 元素用于图形的绘制,通过脚本 (通常是JavaScript)来完成.<canvas> 标签只是图形容器,您必须使用脚本来绘制图形.你可以通过多种方 ...

  2. centos实现永久修改hostname

    前言 介绍一下centos的两种修改hostname的方式. 查看hostname [root@slave02 ~]# hostname slave02 临时性修改 [root@slave02 ~]# ...

  3. jmeter 的安装与配置

    环境配置: 操作系统:win10 JDK:1.8 jmeter:5.0 jmeter 是 java 程序.所以要运行 jmeter 需要先安装配置 jdk. 1.安装配置 jdk 官方网站下载 jdk ...

  4. js实现图片上传预览功能,使用base64编码来实现

    实现图片上传的方法有很多,这里我们介绍比较简单的一种,使用base64对图片信息进行编码,然后直接将图片的base64信息存到数据库. 但是对于系统中需要上传的图片较多时并不建议采用这种方式,我们一般 ...

  5. Vue.js组件之间的调用

    index.html: <div id="app"></div> 运行完index.html之后自动寻找运行main.js文件 main.js: impor ...

  6. 吴裕雄 python深度学习与实践(12)

    import tensorflow as tf q = tf.FIFOQueue(,"float32") counter = tf.Variable(0.0) add_op = t ...

  7. 史上最坑 idea 更改代码不生效

    原来, 如果本地多次调整过系统时间,那么gradle 的缓存 会缓存 你的 上次编译时间再未来,那么你再怎么编译,都很难生效,即使删除了生成的字节码目录. 然后invalidate caches/re ...

  8. react-native 新手爬坑经历(Could not connect to development server.)

    来,先说下报错出现场景,刚跑完项目加载完是好的,但是双击R后就开始耍小脾气了-红屏出现,如下图 首先检查包服务器是否运行正常.在项目文件夹下输入react-native start或者npm star ...

  9. java学习笔记(七):for循环

    java的for循环和c++的for循环类似 public class Test { public static void main(String args[]) { for(int x = 10; ...

  10. python定义类()中写object和不写的区别

    这里需要说明一下: python3中,类定义默认继承object,所以写不写没有区别 但在python2中,并不是这样 所以此内容是针对python2的,当然python3默认继承,不代表我们就傻乎乎 ...