【问题标题】:Multiline strings in VB.NETVB.NET 中的多行字符串
【发布时间】:2010-10-16 22:09:16
【问题描述】:

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

a = """
multi
line
string
"""

还是 PHP?

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

当然不是

"multi" & _
"line

【问题讨论】:

标签: string vb.net


【解决方案1】:

你也可以这样使用System.Text.StringBuilder类:

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

然后你得到多行字符串:

sValue.ToString()

【讨论】:

    【解决方案2】:

    从 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、引用计数或代码分析。

    【讨论】:

      【解决方案3】:

      使用vbCrLfvbNewLine。它适用于 MessageBoxes 和我测试过的许多其他控件。

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

      它将显示两个相同的两行消息框。

      【讨论】:

        【解决方案4】:

        如果您在 VB.Net 中需要带有行代码变量的 XML 文字,您可以这样做:

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

        【讨论】:

        • 请注意您在这里提到 XML 文字的原因,没有看到原始问题中提到的 XML。
        【解决方案5】:

        你可以使用XML Literals来达到类似的效果:

        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.

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

        【讨论】:

        • 如何在其中进行变量替换?比如“ a=" & someint & ","
        • @Christopher - 我通常发现将标记放在字符串常量中然后替换它们更具可读性。所以s="... a=~someint~ ..." 然后s=s.Replace("~someint~', SomeInt)
        • 这似乎不适用于动态编译: CodeDomProvider.CreateProvider("VisualBasic").CompileAssemblyFromFile(, <.vb file with above trick syntax>) ... 任何想法?这只是 VS 2010 的语法糖吗?
        • @romkyns 不正确,我想出了如何使用 CDATA 并且仍然能够使用 进行嵌入,请参阅 here
        • 太棒了!在较新的语法下,如何在不将其引入文字的情况下维护代码缩进?
        【解决方案6】:

        在 Visual Basic 14 中作为 Visual Studio 2015 的一部分提供 https://msdn.microsoft.com/en-us/magazine/dn890368.aspx

        但 R# 尚不支持。好消息是它们很快就会得到支持!请在Youtrack 上投票,以通知 JetBrains 您也需要它们。

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

          • 这很糟糕。您刚刚创建了 4 个字符串实例
          • 我继承了一个遗留的 VB6 代码,我必须移植到充满这些的 VB.NET! :( 在这种情况下,我宁愿牺牲性能来保持可读性。
          • 您不必这样做。您始终可以在不重新分配变量的情况下进行连接,并在这些行中格式化
          • 在我的情况下不适合切换到正确的语法,因为我应该修改一大堆代码并且项目上没有时间了。
          【解决方案8】:

          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 这样的反斜杠转义序列,并且它们允许字符串中包含换行符,并且您可以使用双引号 ""

          【讨论】:

          • 感谢 Lucian 在 VB 中添加多行字符串。也许您可以更新您的答案,因为 VS 2015 现在是 RTM。也许你也可以戳你公司里的人来更新相关的MSDN article
          【解决方案9】:

          我想出了如何同时使用

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

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

          【讨论】:

            【解决方案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 格式化程序。

            【讨论】:

              【解决方案11】:

              你可以像这样使用 XML

              dim vrstr as string = <s>
                  some words
                  some words
                  some
                  words
              </s>
              

              【讨论】:

                【解决方案12】:

                我使用了这个变体:

                     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()
                

                它允许 在字符串中

                【讨论】:

                【解决方案13】:

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

                【讨论】:

                  【解决方案14】:

                  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
                  

                  【讨论】:

                    【解决方案15】:

                    这篇文章对我很有帮助,但没有人提到如何连接以防你想发送一些变量,这是你 99% 的时间需要做的事情。

                    ... 变量 %> ...

                    你是这样做的:

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

                    【讨论】:

                    • 在这种情况下,您希望避免串联,而是使用 SQL 参数,因为它们更适合于抵御 SQL 注入攻击。不过,我可以看到这对于动态 SQL 生成很有用(无需传递用户输入)。
                    【解决方案16】:

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

                    但我也使用 VB.Net,所以这是我获得更易读的长字符串的捷径。

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

                    【讨论】:

                    • 对于每一个看起来很难看的“Line..”,你需要在行尾加上 _。
                    • 其实你没有。更高版本的 VB(我认为是 2010 和更高版本?)在很多情况下不需要 _,包括此处显示的示例。
                    【解决方案17】:

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

                     Dim a = My.Resources.Whatever_you_chose
                    

                    【讨论】:

                      【解决方案18】:

                      对我来说,这是 VB 作为一门语言最烦人的地方。 说真的,我曾经将字符串写在一个文件中,并写了如下代码:

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

                      如果需要的话,我可以直接在 SQL 服务器上测试查询。

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

                      【讨论】:

                        【解决方案19】:

                        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 XML 文字是 .. 特殊的,因为没有更好的词。编译器理解它们,因此将允许它们隐式地跨越多行。没有为多行字符串添加这样的支持。添加这样的支持比 XML 文字容易很多,只是没有达到那个版本的标准。
                        【解决方案20】:

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

                        foo = @"Multiline
                        String"
                        

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

                        【讨论】:

                          【解决方案21】:

                          不,VB.NET 还没有这样的功能。它将在 VB (visual basic 10) 的下一次迭代中可用,但是 (link)

                          【讨论】:

                          • 你确定?我知道他们会允许多行语句,但他们也会允许多行 strings 吗?我的意思是“你好 世界”?
                          • 去除换行符和多行文字字符串是不同的特性。
                          猜你喜欢
                          • 2011-11-17
                          • 2016-08-06
                          • 2015-09-19
                          • 1970-01-01
                          • 2010-11-22
                          • 1970-01-01
                          • 1970-01-01
                          • 2016-03-13
                          • 2012-05-14
                          相关资源
                          最近更新 更多