【问题标题】:How to do a verbatim string literal in VB.NET?如何在 VB.NET 中执行逐字字符串文字?
【发布时间】:2012-10-20 18:19:58
【问题描述】:

你如何在VB.NET中逐字字符串文字?

这在 C# 中实现如下:

String str = @"c:\folder1\file1.txt";

这意味着反斜杠按字面意思处理,而不是转义字符。

这是如何在 VB.NET 中实现的?

【问题讨论】:

    标签: c# vb.net string escaping verbatim-string


    【解决方案1】:

    VB.NET 中的所有字符串文字都是逐字字符串文字。简单写

    Dim str As String = "c:\folder1\file1.txt"
    

    VB.NET 不支持内联控制字符。所以反斜杠总是按字面解释。

    唯一需要转义的字符是双引号,通过双引号进行转义,就像在 C# 中所做的那样

    Dim s As String = """Ahoy!"" cried the captain." ' "Ahoy!" cried the captain.
    

    【讨论】:

    • 有一个很好的理由。换行符。在 C# 中执行 var string = @"SELECT * FROM myTable WHERE etc"; 比 'Dim query As String = "SELECT * " + _ "FROM myTable " + _ "WHERE something" 更干净`
    • 虽然我同意你关于清晰度的结论,但这不是重点。您将行继续 (_) 与字符串连接 (+ 或更好的 &) 混淆了,我已经说过 VB.NET 不支持内联控制字符,因此不需要支持改变含义的特殊字符 (@)一个或多个内部字符串字符。在 c# 中,您需要 @ 将反斜杠的含义更改为其面值,而不是语言允许的转义功能。
    • 不,我真的一点也不混淆他们。这是您的观点,即“没有理由在 VB.NET 中使用相当于 C# 逐字字符串文字,因为它不支持内联控制字符”。 C# 中的逐字字符串允许您将多行字符串值声明为内联而无需串联。 VB 对此缺乏支持,这意味着如果不执行诸如将字符串存储为资源之类的操作,则无法避免连接。这就是 VB 等价物有用的原因,即它不仅仅是转义特殊字符。
    • 这两个字符串是不同的。 C# 版本有换行符和大量空格。
    • 在这个带有文件路径的特定示例中,无论如何使用 Path.DirectorySeparatorChar 可能会更好。
    【解决方案2】:

    VB 无论如何都不会将\ 视为转义字符,因此您可以将字符串写为普通文字:

    Dim str = "c:\folder1\file1.txt"
    

    据我所知,VB 无法实现逐字字符串文字的另一个主要目标,即允许多行 - you have to use VbCrLf for that,我相信。 (当然是Environment.NewLine - 这取决于您的要求。有时您需要特定于系统的行分隔符;有时您需要特定协议要求的特定行分隔符等)

    编辑:Newer versions of VB support multiple lines in string literals

    【讨论】:

    • @Pondidum:当然取决于要求。将编辑。
    • +1 VB.Net 不支持多行字符串文字。有些人使用(或滥用?)XML 文字来实现类似的效果,例如 this(参见评论)。
    【解决方案3】:
    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>  
    

    【讨论】:

    • 为什么投反对票?这是 VB14 之前的一个很好的解决方案
    【解决方案4】:

    VB.NET 不将“\”识别为转义字符。 但是,也许您可​​以使用进一步的解决方案(考虑到它的工作速度比串联慢,例如):

    Dim s As String = Regex.Unescape("c:\\folder1\\file1.txt\nc:\\folder1\\file2.txt\nc:\\folder1\\file3.txt")
    

    在这种情况下,字符串“s”包含三行。 符号“\”是保护下一个“\”免受正则表达式方法 Unescape() 的影响,这就是它每次重复两次的原因。

    "\n" 是一个类似于 C# 的“换行”特殊字符。您也可以使用“\t”(制表符)等。

    【讨论】:

      【解决方案5】:

      如有疑问,请查看此比较页面: http://www.harding.edu/fmccown/vbnet_csharp_comparison.html

      VB.NET

       'No string literal operator     
       Dim filename As String = "c:\temp\x.dat"
      

      C#

      // String literal 
      string filename = @"c:\temp\x.dat";  
      string filename = "c:\\temp\\x.dat";  
      

      【讨论】:

        【解决方案6】:

        @MarkJ 已经在@Jon Skeet 的帖子中指出了这一点。

        VB.Net 支持此 abomination 功能,如果您绝对需要通过内联 XML 文字逐字使用。

        考虑缓存字符串!不要每次都评估这个...

        Imports System.Xml.Linq
        
        Dim cmdText as String = <![CDATA[
        SELECT 
        Field1, Field2, Field3 
        FROM table
        WHERE Field1 = 1
        ]]>.Value
        

        [编辑 2015 年 1 月 5 日]

        VB14 / VS2015 支持多行字符串,没有任何恶作剧。

        Dim cmdText as String = "
        SELECT 
        Field1, Field2, Field3 
        FROM table
        WHERE Field1 = 1"
        

        【讨论】:

          【解决方案7】:

          很遗憾,VB XML 文字在 .vbhtml 剃须刀页面中不起作用。希望下一个版本会有所改变。

          【讨论】:

            猜你喜欢
            • 2015-09-14
            • 2011-03-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-08-13
            • 2017-03-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多