如何在VB.NET中使用verbatim字符串字面量?

67

在VB.NET中如何使用文本字面量

在C#中可以通过以下方式实现:

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

这意味着反斜杠被视为字面值而不是转义字符。

VN.NET如何实现这一点?

7个回答

75

在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.

1
有很好的理由。换行符。在 C# 中执行 var string = @"SELECT * FROM myTable WHERE etc";比 'Dim query As String = "SELECT * " + _ "FROM myTable " + _ "WHERE something"`更加简洁。 - nathanchere
3
我同意你的关于清晰度的结论,但这不是重点。你混淆了行连续符(_)和字符串串联(+或更好的&),我已经说过VB.NET不支持内联控制字符,因此不需要支持改变一个或多个内部字符串字符含义的特殊字符(@)。在C#中,你需要@来改变反斜杠的含义,以便将其转换为语言允许的转义功能的面值。 - Steve
7
不,我并没有混淆它们。这是你的观点,即“VB.NET没有必要提供与C#原样字符串字面量等效的功能,因为它不支持内联控制字符”。在C#中,原样字符串允许你在声明时内联使用多行字符串值而无需连接操作。VB不支持这个功能,这意味着无法避免使用连接操作,除非像将字符串存储为资源之类的替代方法。这就是为什么需要一个VB的等效功能的原因,即它不仅仅是关于转义特殊字符。 - nathanchere
1
在这个特定的例子中,使用Path.DirectorySeparatorChar可能更好。 - phn
1
@nathanchere 自2015年起,VB .NET支持字面换行(但SO评论不支持哈哈) VB还可以隐式地进行行继续以进行附加 同意Steve的观点,无需使用verbatim标记,因为VB中的字符串默认为verbatim。更需要插值标记,在$中现在有了这个功能。 https://learn.microsoft.com/en-us/dotnet/visual-basic/programming-guide/language-features/strings/interpolated-strings - Jason S
显示剩余2条评论

34

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

如果您绝对需要通过内联XML文字直接使用文本,则VB.Net支持这个“可恶”的特性。

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

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"

内联 XML 文字是 VB 语言拥有的特性,我无法相信 C# 还没有添加这个功能。再加上可选的引用传递。 - Brain2000
每次有人点赞,都让我庆幸自己不再从事那个在VB.NET和C#之间切换的工作。VB.NET是一门不错的语言,但我并不怀念它... - undefined

12
VB不会将\视为转义字符,因此您可以将字符串写成普通文字形式:
Dim str = "c:\folder1\file1.txt"

据我所知,VB没有实现原样字符串文字的另一个主要目标,即允许多行-你必须使用VbCrLf, 我相信。(或者当然也可以使用 Environment.NewLine - 这取决于您的需求。有时您需要系统特定的行分隔符;有时您需要特定协议所需的特定行分隔符等。)
编辑:VB的新版本支持在字符串文字中使用多行

1
@Pondidum:当然,这取决于需求。会进行编辑的。 - Jon Skeet
1
VB.Net不支持多行字符串字面量。一些人使用(或滥用?)XML字面量来实现类似的效果,例如这样(请参见评论)。 - MarkJ

5

2
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之前的一个很好的解决方案。 - Mo Gauvin

2

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”(制表符)等其他特殊字符。


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接