Cadeias de linhas múltiplas no VB.NET

144

Existe uma maneira de ter seqüências multilinhas no VB.NET como Python

a = """
multi
line
string
"""

ou PHP?

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

Claro que algo que não é

"multi" & _
"line
pistacchio
fonte
1
BTW: '"multi" & _ <newline> "line"' é uma string literal, não duas. Ainda é feio, no entanto.
Joel Coehoorn
Meus dois centavos: no VS 2017, seu código VB.NET seria compilado.
precisa saber é o seguinte

Respostas:

222

Você pode usar literais XML para obter um efeito semelhante:

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

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

Lembre-se de que se você tiver caracteres especiais, use um bloco CDATA:

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

ATUALIZAÇÃO DE 2015:

Literais de seqüência de caracteres de várias linhas foram introduzidas no Visual Basic 14 (no Visual Studio 2015 ). O exemplo acima agora pode ser escrito como:

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.

Os detalhes são adicionados ao repositório do Roslyn New-Language-Features-in-VB-14 Github.

Vincenzo Alcamo
fonte
como você pode fazer substituições variáveis ​​lá? como "a =" & someint & ","
Christopher Mahan
1
@Christopher - normalmente acho mais legível colocar tokens na string constante e depois substituí-los. Então s="... a=~someint~ ..."e então s=s.Replace("~someint~', SomeInt).
Herb Caudill
Isso não parece funcionar com a compilação dinâmica: CodeDomProvider.CreateProvider ("VisualBasic"). CompileAssemblyFromFile (<opções>, arquivo <.vb com sintaxe de truque acima>) ... Alguma idéia? Isso é apenas açúcar sintático do VS 2010?
Chad
1
@romkyns Não é verdade, eu descobri como usar CDATA e ainda ser capaz de incorporar usando <% =%> Veja aqui
Nelson
1
Impressionante! Como você mantém o recuo do código sem introduzi-lo no literal sob a sintaxe mais recente?
Panzercrisis
50

VB.Net não tem essa característica e vai não estar chegando no Visual Studio 2010. O recurso que jirwin está se referindo é chamado implícita continuação de linha. Tem a ver com a remoção do _ de uma instrução ou expressão de várias linhas. Isso elimina a necessidade de terminar uma cadeia de linhas multilinha com _, mas ainda não existe uma cadeia de linhas multilinha literal no VB.

Exemplo para cadeia de linhas múltiplas

Visual Studio 2008

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

Visual Studio 2010

Dim x = "line1" & vbCrlf & 
        "line2"
JaredPar
fonte
Então, como funciona para literais XML? Ou é possível, ou literais XML estão usando uma técnica diferente - e, se for uma técnica diferente, uma que possa ser estendida para cadeias de linhas múltiplas.
precisa saber é o seguinte
1
Literais XML @mellamokb são .. especiais por falta de uma palavra melhor. O compilador os entende e, portanto, permitirá que eles abranjam várias linhas implicitamente. Nenhum suporte foi adicionado para cadeias de linhas múltiplas. Adicionar esse suporte é muito mais fácil do que os literais XML, mas simplesmente não atendeu às expectativas desse lançamento.
JaredPar
38

Eu usei esta variante:

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

permite <> na string

ozzy432836
fonte
1
Ótima técnica, mas pode ser necessário adicionar algumas referências ao seu projeto para que ele funcione. Consulte: msdn.microsoft.com/pt-br/library/bb531455%28v=vs.90%29.aspx e stackoverflow.com/a/28654126/3175562
Mike
30

Sequências de várias linhas estão disponíveis desde o Visual Studio 2015.

Dim sql As String = "
    SELECT ID, Description
    FROM inventory
    ORDER BY DateAdded
"

Você pode combiná-los com interpolação de string para maximizar a utilidade:

Dim primaryKey As String = "ID"
Dim inventoryTable As String = "inventory"

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

Nota que as cordas interpolados começar $e você precisa tomar cuidado de ", {e }contido dentro - convertê-los em "", {{ou }}respectivamente.

Aqui você pode ver o real realce da sintaxe de partes interpoladas do exemplo de código acima:

insira a descrição da imagem aqui

Se você se perguntar se o reconhecimento deles pelo editor do Visual Studio também funciona com refatoração (por exemplo, renomeação em massa das variáveis), então você está certo, a refatoração de código funciona com elas. Sem mencionar que eles também oferecem suporte ao IntelliSense, contagem de referência ou análise de código.

miroxlav
fonte
20

Literais de cadeia de linhas múltiplas são introduzidos no Visual Basic 14.0 - https://roslyn.codeplex.com/discussions/571884

Você pode usá-lo na Pré-visualização do VS2015, já disponível - http://www.visualstudio.com/en-us/downloads/visual-studio-2015-downloads-vs (observe que você ainda pode usar o VS2015 mesmo quando estiver direcionando um versão do framework .NET)

Dim multiline = "multi
line
string"

As strings VB agora são basicamente as mesmas que as strings verbais de C # - elas não suportam sequências de escape de barra invertida como \ n e permitem novas linhas dentro da string, e você escapa o símbolo de aspas com aspas duplas ""

Lucian Wischik
fonte
2
Obrigado Lucian por adicionar seqüências de várias linhas ao VB. Talvez você possa atualizar sua resposta, porque o VS 2015 agora é RTM. E talvez você também possa cutucar alguém da sua empresa para atualizar o artigo relacionado do MSDN .
Miroxlav
14

este foi um artigo realmente útil para mim, mas ninguém mencionou como concatenar caso você queira enviar algumas variáveis, que é o que você precisa fazer 99% do tempo.

... <% = variável %> ...

Aqui está como você faz isso:

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

Destructerator
fonte
17
Nesse caso, você deseja evitar a concatenação e, em vez disso, usar parâmetros SQL, pois eles são melhores para proteger contra ataques de injeção SQL. Eu posso ver isso sendo útil para a geração dinâmica de SQL (sem passar a entrada do usuário).
Chad Levy
10

Bem, desde que você parece estar em seu python, posso sugerir que você copie seu texto em python, como:

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

então faça um:

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

ou

  print ' & _ \n'.join(map(lambda s: '"%s"' % s, s.split('\n')))

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

pelo menos você pode copiar isso e colocá-lo no seu código VB. Pontos de bônus se você vincular uma tecla de atalho (mais rápida para obter: Autohotkey ) para fazer isso para o que estiver no seu buffer de colagem. A mesma idéia funciona bem para um formatador SQL.

RichardJohnn
fonte
8

Literais de sequências de várias linhas no vb.net usando a classe 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
windchaser
fonte
7

Para mim, essa é a coisa mais irritante sobre o VB como idioma. Sério, uma vez eu escrevi a string em um arquivo e escrevi um código semelhante ao:

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

só assim eu poderia testar a consulta diretamente no servidor SQL, se necessário.

Meu método atual é usar um procedimento armazenado no SQL Server e apenas chamar isso para que eu possa passar parâmetros para a consulta, etc.

Osiname
fonte
5

Eu descobri como usar ambos <! [CDATA [junto com <% = para variáveis, o que permite que você codifique sem se preocupar.

Você basicamente precisa finalizar as tags CDATA antes da variável VB e adicioná-la novamente depois para que o CDATA não capture o código VB. Você precisa agrupar todo o bloco de código em uma tag, pois terá vários blocos CDATA.

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

Você poderia (deveria?) Colocar a string em um arquivo de recurso (por exemplo, "Meu Projeto" / Recursos) e depois obtê-la com

 Dim a = My.Resources.Whatever_you_chose
habakuk
fonte
3

Disclaimer: Eu amo python. Suas seqüências de linhas múltiplas são apenas uma razão.

Mas eu também faço VB.Net, então aqui está o meu atalho para seqüências longas mais legíveis.

  Dim lines As String() = {
    "Line 1",
    "Line 2",
    "Line 3"
  }
  Dim s As String = Join(lines, vbCrLf)
John Samuel Anderson
fonte
1
Você precisa _ no final da linha para cada "Linha .." que parecer feia.
Kenji Noguchi
2
Na verdade você não. Versões posteriores do VB (2010 e posteriores, eu acho?) Não exigem _ em muitos casos, incluindo o exemplo mostrado aqui.
Darryl
2

você pode usar XML para isso como

dim vrstr as string = <s>
    some words
    some words
    some
    words
</s>
Jack Gajanan
fonte
1

no Visual studio 2010 (VB NET) eu tento o seguinte e funciona bem

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>
user1166557
fonte
0

Se você precisar de um literal XML no VB.Net com uma variável de código de linha, é assim que você faria:

<Tag><%= New XCData(T.Property) %></Tag>
Ori Samara
fonte
Observe bem por que você está mencionando um literal XML aqui, não veja o XML mencionado na pergunta original.
Kreixner #
0

Você também pode usar a System.Text.StringBuilderclasse desta maneira:

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

Então você obtém a sequência multilinha usando:

sValue.ToString()
ᗩИ Ꭰ ЯƎᗩ
fonte
-1

Como esse é um problema de legibilidade, usei o seguinte código:

MySql = ""
MySql = MySql & "SELECT myTable.id"
MySql = MySql & " FROM myTable"
MySql = MySql & " WHERE myTable.id_equipment = " & lblId.Text
Zac
fonte
1
Isto é mau. Você acabou de criar 4 instâncias de string
TS
Eu herdei um código VB6 legado que tenho que portar para o VB.NET que está cheio deles! :( Neste caso eu prefiro sacrificar o desempenho para manter a legibilidade.
Zac
Você não precisa. Você sempre pode concatenar sem reatribuir uma variável e formatar dentro dessas linhas
TS
No meu caso, não é aplicável alternar para a sintaxe correta, pois devo modificar um monte de código e não resta tempo no projeto.
Zac
-1

Use vbCrLfou vbNewLine. Funciona com MessageBoxes e muitos outros controles que testei.

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

Ele mostrará duas MessageBoxes idênticas com 2 linhas.

LuizLoyola
fonte
-9

Não, o VB.NET ainda não possui esse recurso. Ele estará disponível na próxima iteração do VB (visual basic 10), no entanto ( link )

Jason Irwin
fonte
Tem certeza que? Eu sei que eles permitirão declarações de múltiplas linhas, mas eles também permitirão seqüências de múltiplas linhas ? Quero dizer "olá, <newline> mundo"?
Mehrdad Afshari 01/04/09
1
A remoção do caractere de continuação de linha e de cadeias literais de várias linhas são recursos diferentes.
JaredPar
-16

se for como C # (não tenho o VB.Net instalado), você pode prefixar uma string com @

foo = @"Multiline
String"

isso também é útil para coisas como @ "C: \ Windows \ System32 \" - basicamente desativa o escape e ativa a multilinha.

Andy Hohorst
fonte