VB.NET中的多行字符串

161

在 VB.NET 中是否有像 Python 一样的多行字符串的方法?

a = """
multi
line
string
"""

选择什么,PHP还是Python?

$a = <<<END
multi
line
string
END;

当然,如果一个东西不是

"multi" & _
"line

1
顺便说一下:'"multi" & _ <newline> "line"' 是一个字符串字面量,而不是两个。虽然它仍然很丑陋。 - Joel Coehoorn
对于C#,请参考[代码:生成多行字符串文字(Visual C#)](http://msdn.microsoft.com/en-us/library/aa287596(v=vs.71).aspx) - LCJ
我的建议是:在VS 2017中,你的VB.NET代码将被编译。 - ᗩИᎠЯƎᗩ
21个回答

240

您可以使用XML 文本来实现类似的效果:

Imports System.XML
Imports System.XML.Linq
Imports System.Core

Dim s As String = <a>Hello
World</a>.Value

记住,如果你有特殊字符,应该使用 CDATA 块:

Dim s As String = <![CDATA[Hello
World & Space]]>.Value

2015年更新:

多行字符串文字在Visual Basic 14(在Visual Studio 2015中)中被引入。现在可以将上面的示例编写为:

Dim s As String = "Hello
World & Space"

截至2015-08-01,MSDN文章尚未更新,因此请查看下面的一些答案以了解详细信息。

有关详细信息,请参阅RoslynVB 14中的新语言功能 Github存储库。


1
@Christopher - 我通常发现将标记放在字符串常量中更易读,然后再进行替换。因此s="... a=~someint~ ...",然后s=s.Replace("~someint~', SomeInt) - Herb Caudill
1
这似乎无法与动态编译一起使用:CodeDomProvider.CreateProvider("VisualBasic").CompileAssemblyFromFile(<options>, <.vb file with above trick syntax in it>) ... 有什么想法吗?这只是VS 2010的语法糖吗? - Chad
1
@romkyns 不是这样的,我已经想出如何使用CDATA并仍然能够使用<%= %>进行嵌入。请参见此处 - Nelson
1
太棒了!在新语法下,如何保持代码缩进而不将其引入字面量? - Panzercrisis
1
如果其他人遇到相同的问题 - 在VS2015中,Roslyn显然未启用Web Site项目类型,必须单独下载。请参见:http://blogs.msdn.com/b/webdev/archive/2014/05/12/enabling-the-net-compiler-platform-roslyn-in-asp-net-applications.aspx - Mike W
显示剩余5条评论

52

VB.Net没有这个功能,而且它也不会在Visual Studio 2010中推出。Jirwin所指的功能被称为隐式行连续。它与从多行语句或表达式中移除_有关。这确实消除了使用_终止多行字符串的需要,但在VB中仍然没有多行字符串字面量。

多行字符串的示例

Visual Studio 2008

Dim x = "line1" & vbCrlf & _
        "line2"

Visual Studio 2010

Dim x = "line1" & vbCrlf & 
        "line2"

那么XML字面量是如何工作的呢?要么这是可能的,要么XML字面量使用了不同的技术 - 如果是不同的技术,那么可以将其扩展到多行字符串。 - mellamokb
1
@mellamokb XML 文字量很特殊,缺乏更好的形容词。编译器理解它们,因此会允许它们隐式跨越多行。但是,没有为多行字符串添加这样的支持。添加这样的支持要比 XML 文字量容易得多,只是它未能满足该版本的标准。 - JaredPar

44
我使用了这种变量:
     Dim query As String = <![CDATA[
        SELECT 
            a.QuestionID
        FROM 
            CR_Answers a

        INNER JOIN 
            CR_Class c ON c.ClassID = a.ClassID
        INNER JOIN
            CR_Questions q ON q.QuestionID = a.QuestionID
        WHERE 
            a.CourseID = 1
        AND 
            c.ActionPlan = 1
        AND q.Q_Year = '11/12'
        AND q.Q_Term <= (SELECT CurrentTerm FROM CR_Current_Term)
    ]]>.Value()

它允许在字符串中使用 < > 符号


1
很棒的技巧,但是为了让它起作用,你可能需要添加一些参考到你的项目中。请参阅:https://msdn.microsoft.com/en-us/library/bb531455%28v=vs.90%29.aspx和http://stackoverflow.com/a/28654126/3175562。 - Mike

41

自Visual Studio 2015起,多行字符串可用。

Dim sql As String = "
    SELECT ID, Description
    FROM inventory
    ORDER BY DateAdded
"
你可以使用字符串插值将它们结合起来以最大化其有用性:
Dim primaryKey As String = "ID"
Dim inventoryTable As String = "inventory"

Dim sql As String = $"
    SELECT {primaryKey}, Description
    FROM {inventoryTable}
    ORDER BY DateAdded
"

请注意,插值字符串以$开头,您需要注意包含在其中的"{} - 将它们分别转换为""{{}}

下面您可以看到上面代码示例中插值部分的实际语法高亮显示

enter image description here

如果您想知道Visual Studio编辑器是否也支持重构(例如批量重命名变量),那么您是正确的,代码重构适用于这些内容。更不用说他们还支持智能感知,引用计数或代码分析。


22

多行字符串文字在Visual Basic 14.0中被引入- https://roslyn.codeplex.com/discussions/571884

您可以在VS2015预览版中使用它,现在就可以下载 - http://www.visualstudio.com/en-us/downloads/visual-studio-2015-downloads-vs(请注意,即使针对较旧版本的.NET框架,仍可以使用VS2015)

Dim multiline = "multi
line
string"

VB字符串基本上与C#逐字字符串相同-它们不支持反斜杠转义序列(如\n),并且它们允许字符串内部有换行符,您可以使用双引号“”来转义引号符。


2
谢谢Lucian将多行字符串添加到VB中。也许你可以更新一下你的回答,因为VS 2015现在已经发布了。也许你还可以提醒公司内的某人更新相关的MSDN文章 - miroxlav

16

这篇文章对我来说非常有帮助,但没有人提到如何在需要发送变量的情况下进行连接,而这正是你99%的时间所需做的。

... <%= 变量名 %> ...

以下是具体操作:

<SQL> SELECT * FROM MyTable WHERE FirstName='<%= EnteredName %>' </SQL>.Value


18
在这种情况下,你应该避免使用连接操作,而是使用SQL参数,因为它们更有效地防范SQL注入攻击。我可以看出,在动态SQL生成中,这会很有用(不需要传递用户输入)。 - Chad Levy

10

好的,既然您似乎对Python很熟悉,我建议您将文本复制到Python中,例如:

 s="""this is gonna 
last quite a 
few lines"""

然后执行:

  for i in s.split('\n'):
    print 'mySB.AppendLine("%s")' % i

#    mySB.AppendLine("this is gonna")
#    mySB.AppendLine("last quite a")
#    mySB.AppendLine("few lines")
或者
  print ' & _ \n'.join(map(lambda s: '"%s"' % s, s.split('\n')))

#    "this is gonna" & _ 
#    "last quite a" & _ 
#    "few lines"

那么你至少可以将其复制并粘贴到你的VB代码中。如果你绑定了一个热键(最快获取:Autohotkey),就可以自动执行这项任务,并且也适用于SQL格式化工具。


9
使用XElement类在VB.NET中创建多行字符串文字。
Imports System.Xml.Linq

Public Sub Test()

dim sOderBy as string = ""

dim xe as XElement = <SQL>
                SELECT * FROM <%= sTableName %>
                 <ORDER_BY> ORDER BY <%= sOrderBy %></ORDER_BY>
                 </SQL>

'** conditionally remove a section 
if sOrderBy.Length = 0 then xe.<ORDER BY>.Remove

'** convert XElement value to a string 
dim sSQL as String = xe.Value

End Sub

8

对我来说,VB作为一种编程语言最让人恼火的事情就是这个。说真的,我曾经在文件中写入了字符串,并编写了类似于以下代码的内容:

Dim s as String = file_get_contents("filename.txt")

我只是想直接在SQL服务器上测试查询语句,以便需要时可以进行测试。

我的当前方法是在SQL Server上使用存储过程,然后调用它,以便可以传递参数到查询语句等。


也许在项目中包含一个 .sql 文件扩展名(如果尚未引入存储过程)是个好主意。https://stackoverflow.com/questions/41860260/how-to-add-an-sql-file-to-resources-in-visual-studio#:~:text=Right%2Dclick%20your%20project%20in,Action%22%20to%20%22Embedded%20Resource%22 - federico

5
我学会了如何同时使用<![CDATA[和<% =变量,这样你就可以无忧地编写代码了。
你需要在VB变量之前终止CDATA标记,然后在之后重新添加它,以便CDATA不捕获VB代码。你需要将整个代码块包装在一个标记中,因为你将有多个CDATA块。
Dim script As String = <code><![CDATA[
  <script type="text/javascript">
    var URL = ']]><%= domain %><![CDATA[/mypage.html';
  </script>]]>
</code>.value

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