VB.NET中的多行字符串

从我有关于vb.net的记忆开始,VB.net程序员们就一直因为代码中的多行字符串问题一次又一次地被击倒。
一开始,大家使用 & 和换行符 _ 来连接字符串,呃,后来程序员们觉得这太荒唐了,于是出现了高级一些的用法,例如StringBuilder(经常被我简写成sb)。即便如此,VB.net的多行字符串还是无法做到像C#一样的简洁与高可读性:

string query = @"SELECT first, last
FROM table 
WHERE id = 1";

VB.NET的IDE包括编译器很“自然”地不支持这些特性,原因嘛,简单来说,就是VB.NET没有分号。由大量的连接符和换行符(甚至还有vbCrLf和ControlChars.NewLine)组成的多行字符串使代码非常混乱而且使可读性变得很低,导致很长一段时间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"

至于你晕不晕,反正我是晕了......






漫长的冬天持续了很长时间,直到XML Literal的出现


什么是XML Literal呢?
"XML Literal"是在VB.NET 9.0引入的一个用于构建XML对象的新特性。VB.NET有了如此神器,现在轮到C#程序员羡慕了。当然这篇文章不是说如何使用XML Literal的,关于这个新特性的更多信息可以参考MSDN:
http://msdn.microsoft.com/en-us/library/bb384629.aspx


有了XML Literal之后,我们如何用它解决VB.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>



对比一下前面的代码,有没有发自内心的想说出“我靠”两个字?
经过试验,代码中的<string>不是必须叫"string"的,你也可以改成<字符串></字符串>,呃,如果你喜欢的话。原理嘛,就是编译器将代码中的xml片段转换成了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的显式类型声明,然后后面调用.Value属性以确定这个变量确实是字符串。实际上与上面代码相比,这两段代码在编译、运行时并没有什么区别。也许第二种更漂亮些?



有的时候,多行字符串存在的意义就是把他们显示在窗口、控制台或者MsgBox中,不知你发现没有,上面的XML片段中的多行字符串.....都是有超级多的前置空格的(为了保持代码伸缩性,看起来也漂亮,主要原因其实是XML文本并不关心空格的多少)。
不过我敢肯定,实际上你并不需要这么多没有用的空格。那怎么样去掉这些空格呢?这个并没有什么现成的办法,所以说,最后呢,at last,归根结底,你需要做的事情只有一个——把空格们都删掉:


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


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值