VB.NET中的多行字符串


144

有没有办法像Python一样在VB.NET中具有多行字符串

a = """
multi
line
string
"""

还是PHP?

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

当然不是

"multi" & _
"line

1
顺便说一句:'“ multi”&_ <newline>“ line”'是一个字符串文字,而不是两个。不过,它仍然很难看。
Joel Coehoorn


我的两分钱:在VS 2017中,将编译您的VB.NET代码。
ᗩИᎠЯƎᗩ

Answers:


222

您可以使用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"

MSDN article isn't updated yet (as of 2015-08-01), so check some answers below for details.

详细信息已添加到VB-14 Github存储库中的Roslyn New-Language-Features-in


如何在那里进行变量替换?就像“ a =“&someint&”,
Christopher Mahan

1
@Christopher-我通常发现将标记放在字符串常量中,然后替换它们更具可读性。如此s="... a=~someint~ ..."反复s=s.Replace("~someint~', SomeInt)
赫尔·卡迪尔

这似乎不适用于动态编译:CodeDomProvider.CreateProvider(“ VisualBasic”)。CompileAssemblyFromFile(<options>,<.vb文件,其中具有以上技巧的语法>)...有什么想法吗?这仅仅是VS 2010的语法糖吗?
乍得2012年

1
@romkyns不是真的,我想通了如何使用CDATA,仍然能够使用<%=%>见嵌入在这里
尼尔森

1
太棒了!如何保持代码缩进而不在新语法下将其引入文字中?
Panzercrisis

50

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

38

我使用了这种变体:

     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
很棒的技术,但是可能必须添加一些对您的项目的引用才能使它起作用。请参阅: msdn.microsoft.com/en-us/library/bb531455%28v=vs.90%29.aspxstackoverflow.com/a/28654126/3175562
Mike

30

自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
"

需要注意的是插值字符串开始$,你需要照顾"{}包含内-它们转化成""{{}}分别。

在这里,您可以看到上述代码示例的内插部分的实际语法高亮显示

在此处输入图片说明

如果您想知道Visual Studio编辑器对它们的识别是否也适用于重构(例如,对变量进行大量重命名),那么您是对的,代码重构可以使用这些重构。更不用说它们还支持IntelliSense,引用计数或代码分析。


20

在Visual Basic 14.0中引入了多行字符串文字-https: //roslyn.codeplex.com/discussions/57188​​4

您可以立即在VS2015预览版中使用,然后使用-http: //www.visualstudio.com/en-us/downloads/visual-studio-2015-downloads-vs(请注意,即使以较早版本为目标,您仍然可以使用VS2015 .NET框架的版本)

Dim multiline = "multi
line
string"

现在,VB字符串基本上与C#逐字字符串相同-它们不支持\ n之类的反斜杠转义序列,并且它们确实允许在字符串中使用换行符,并且您可以使用双引号“”对引号进行转义


2
感谢Lucian将多行字符串添加到VB中。也许您可以更新答案,因为VS 2015现在是RTM。也许您也可以戳公司中的某个人来更新相关的MSDN文章
miroxlav

14

这对我来说真的是很有帮助的文章,但是没有人提到如何在要发送一些变量的情况下进行连接,这是99%的时间需要执行的操作。

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

这是您的操作方式:

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


17
在这种情况下,您要避免级联,而应使用SQL参数,因为它们可以更好地抵抗SQL注入攻击。我可以看到,这对于动态SQL生成很有用(无需传递用户输入)。
乍得利维

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格式化程序,相同的想法也适用。


8

vb.net中使用XElement类的多行字符串文字。

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

7

对我来说,这是VB语言最令人讨厌的事情。认真地说,我曾经将字符串写到文件中,然后按照以下方式编写代码:

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

只是这样,如果需要的话,我可以直接在SQL Server上测试查询。

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


5

我想出了如何在变量中同时使用<![CDATA [和<%=),这使您无需担心。

基本上,您必须在VB变量之前终止CDATA标记,然后在VB变量之后重新添加它,以使CDATA无法捕获VB代码。您需要将整个代码块包装在一个标签中,因为您将拥有多个CDATA块。

Dim script As String = <code><![CDATA[
  <script type="text/javascript">
    var URL = ']]><%= domain %><![CDATA[/mypage.html';
  </script>]]>
</code>.value

3

您可以(应该?)将字符串放入资源文件(例如“ My Project” / Resources)中,然后使用

 Dim a = My.Resources.Whatever_you_chose

3

免责声明:我喜欢python。它是多行字符串只是原因之一。

但是我也做VB.Net,所以这是我的捷径,可读取长字符串。

  Dim lines As String() = {
    "Line 1",
    "Line 2",
    "Line 3"
  }
  Dim s As String = Join(lines, vbCrLf)

1
对于每个看上去很丑陋的“行..”,您都需要在行末添加_。
2013年

2
其实你不知道。在很多情况下(包括此处显示的示例),VB的更高版本(2010年以及我认为更高的版本?)都不需要_。
Darryl 2015年


1

在Visual Studio 2010(VB NET)中我尝试以下操作并正常运行

Dim HtmlSample As String = <anything>what ever you want to type here with multiline strings</anything>

dim Test1 as string =<a>onother multiline example</a>


0

如果您需要VB.Net中带有行代码变量的XML文字,则可以采用以下方法:

<Tag><%= New XCData(T.Property) %></Tag>

请注意确定为什么在这里提到XML文字,而原始问题中没有提到XML。
Kmeixner'3

0

您还可以通过System.Text.StringBuilder以下方式使用类:

Dim sValue As New System.Text.StringBuilder
sValue.AppendLine("1st Line")
sValue.AppendLine("2nd Line")
sValue.AppendLine("3rd Line")

然后,使用以下命令获取多行字符串:

sValue.ToString()

-1

由于这是一个可读性问题,因此我使用了以下代码:

MySql = ""
MySql = MySql & "SELECT myTable.id"
MySql = MySql & " FROM myTable"
MySql = MySql & " WHERE myTable.id_equipment = " & lblId.Text

1
这不好。您刚刚创建了4个字符串实例
TS TS

我继承了一个遗留的VB6代码,我必须移植到完整的VB.NET中!:(在这种情况下,我宁愿牺牲性能来保持可读性
。– Zac

不用了 您始终可以串联而无需重新分配变量,并且可以在这些行中设置格式
TS

就我而言,不适用于切换到正确的语法,因为我应该修改一堆完整的代码,并且项目上没有剩余时间。
扎克2015年

-1

使用vbCrLfvbNewLine。它可以与MessageBoxes和我测试过的许多其他控件一起使用。

Dim str As String
str = "First line" & vbCrLf & "Second line"
MsgBox(str)
str = "First line" & vbNewLine & "Second line"
MsgBox(str)

它将显示两行相同的两个相同的MessageBox。


-9

不,VB.NET尚不具有此功能。但是,它将在VB的下一个迭代版本(Visual Basic 10)中可用(链接


你确定?我知道他们会允许多行语句,但是他们也会允许多行字符串吗?我的意思是“你好<newline>世界”?
Mehrdad Afshari

1
删除行连续字符和多行文字字符串是不同的功能。
JaredPar

-16

如果就像C#(我没有安装VB.Net),则可以在字符串前面加上@

foo = @"Multiline
String"

这对于诸如@“ C:\ Windows \ System32 \”之类的东西也很有用-它实际上关闭了转义并打开了多行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.