Stringhe multilinea in VB.NET


144

C'è un modo per avere stringhe multilinea in VB.NET come Python

a = """
multi
line
string
"""

o PHP?

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

Certo qualcosa che non lo è

"multi" & _
"line

1
A proposito: '"multi" & _ <newline> "line"' è una stringa letterale, non due. È comunque brutto, comunque.
Joel Coehoorn,


I miei due centesimi: in VS 2017 il tuo codice VB.NET sarebbe stato compilato.
ᗩИ Ꭰ ЯƎᗩ

Risposte:


222

È possibile utilizzare i letterali XML per ottenere un effetto simile:

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

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

Ricorda che se hai caratteri speciali, dovresti usare un blocco CDATA:

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

AGGIORNAMENTO 2015:

I letterali di stringa multilinea sono stati introdotti in Visual Basic 14 (in Visual Studio 2015 ). L'esempio sopra può ora essere scritto come:

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.

I dettagli vengono aggiunti al repository Github Roslyn New-Language-Features-in-VB-14 .


come è possibile eseguire sostituzioni variabili? come "a =" & someint & ","
Christopher Mahan,

1
@Christopher: in genere trovo più leggibile inserire i token nella costante di stringa e quindi sostituirli. Quindi s="... a=~someint~ ..."e allora s=s.Replace("~someint~', SomeInt).
Herb Caudill,

Ciò non sembra funzionare con la compilazione dinamica: CodeDomProvider.CreateProvider ("VisualBasic"). CompileAssemblyFromFile (<opzioni>, <.vb con la sintassi del trucco sopra in esso>) ... Qualche idea? Questo è solo zucchero sintetico VS 2010?
Chad,

1
@romkyns Non è vero, ho capito come usare CDATA ed essere ancora in grado di incorporare usando <% =%> Vedi qui
Nelson

1
Eccezionale! Come si mantiene il rientro del codice senza introdurlo nel letterale con la sintassi più recente?
Panzercrisis,

50

VB.Net non dispone di tale funzionalità e non arriverà in Visual Studio 2010. La funzionalità a cui fa riferimento jirwin si chiama continuazione di riga implicita. Ha a che fare con la rimozione di _ da un'istruzione o un'espressione multilinea. Ciò elimina la necessità di terminare una stringa multilinea con _ ma non esiste ancora una stringa multilinea letterale in VB.

Esempio per stringa multilinea

Visual Studio 2008

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

Visual Studio 2010

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

Quindi come funziona per i letterali XML? O è possibile, oppure i letterali XML stanno usando una tecnica diversa - e se una tecnica diversa, allora quella che potrebbe essere estesa a stringhe multilinea.
mellamokb,

1
I letterali XML di @mellamokb sono .. speciali per mancanza di una parola migliore. Il compilatore li comprende e quindi consentirà loro di estendere implicitamente più righe. Nessun supporto di questo tipo è stato aggiunto per le stringhe multilinea. L'aggiunta di tale supporto è molto più semplice dei letterali XML, ma non ha soddisfatto la barra di quella versione.
JaredPar,

38

Ho usato questa 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()

consente <> nella stringa


1
Ottima tecnica, ma potrebbe essere necessario aggiungere alcuni riferimenti al progetto per farlo funzionare. Vedi: msdn.microsoft.com/en-us/library/bb531455%28v=vs.90%29.aspx e stackoverflow.com/a/28654126/3175562
Mike

30

Le stringhe multilinea sono disponibili da Visual Studio 2015.

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

Puoi combinarli con l'interpolazione di stringhe per massimizzare l'utilità:

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

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

Nota che le stringhe interpolate iniziano con $e devi prenderti cura di ", {e }contenute al suo interno - convertirle in "", {{o }}rispettivamente.

Qui puoi vedere l' evidenziazione della sintassi effettiva delle parti interpolate dell'esempio di codice sopra:

inserisci qui la descrizione dell'immagine

Se ti chiedi se il loro riconoscimento da parte dell'editor di Visual Studio funziona anche con il refactoring (ad esempio rinominando in massa le variabili), allora hai ragione, il refactoring del codice funziona con questi. Senza contare che supportano anche IntelliSense, il conteggio dei riferimenti o l'analisi del codice.


20

I valori letterali di stringa multilinea sono introdotti in Visual Basic 14.0 - https://roslyn.codeplex.com/discussions/571884

È possibile utilizzarlo quindi nell'anteprima di VS2015, ora disponibile - http://www.visualstudio.com/en-us/downloads/visual-studio-2015-downloads-vs (notare che è ancora possibile utilizzare VS2015 anche quando si sceglie come target un vecchio versione di .NET framework)

Dim multiline = "multi
line
string"

Le stringhe VB ora sono sostanzialmente le stesse delle stringhe testuali C #: non supportano sequenze di escape di barra rovesciata come \ n e consentono nuove righe all'interno della stringa e si evita il simbolo delle virgolette con le virgolette doppie ""


2
Grazie Lucian per l'aggiunta di stringhe multilinea nel VB. Forse puoi aggiornare la tua risposta, perché VS 2015 ora è RTM. E forse puoi anche colpire qualcuno nella tua azienda per aggiornare l' articolo MSDN correlato .
miroxlav,

14

questo è stato un articolo davvero utile per me, ma nessuno ha menzionato come concatenare nel caso in cui si desideri inviare alcune variabili, che è ciò che è necessario fare il 99% delle volte.

... <% = variabile %> ...

Ecco come lo fai:

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


17
In questo caso, si desidera evitare la concatenazione e utilizzare invece i parametri SQL poiché sono più efficaci nell'indurire contro gli attacchi di iniezione SQL. Vedo che ciò è utile per la generazione dinamica di SQL, anche se (senza passare l'input dell'utente).
Chad Levy,

10

Bene, dato che sembri essere sul tuo python, posso suggerirti di copiare il tuo testo in Python, come:

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

quindi fai un:

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

o

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

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

allora almeno puoi copiarlo e inserirlo nel tuo codice VB. Punti bonus se si associa un tasto di scelta rapida (il più veloce da ottenere con: tasto di scelta rapida automatica ) per farlo per qualsiasi cosa si trovi nel buffer di incollaggio . La stessa idea funziona bene per un formattatore SQL.


8

Letterali di stringa multilinea in vb.net usando la 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

7

Per me questa è la cosa più fastidiosa di VB come lingua. Seriamente, una volta ho scritto la stringa in un file e ho scritto qualcosa di simile a questo:

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

solo così ho potuto testare la query direttamente sul server SQL, se necessario.

Il mio metodo attuale è quello di utilizzare una procedura memorizzata su SQL Server e chiamarla in modo da poter passare i parametri alla query, ecc


5

Ho capito come usare entrambi <! [CDATA [insieme a <% = per le variabili, che ti permette di scrivere codice senza preoccupazioni.

Fondamentalmente devi terminare i tag CDATA prima della variabile VB e quindi aggiungerli nuovamente dopo in modo che CDATA non acquisisca il codice VB. Devi racchiudere l'intero blocco di codice in un tag perché avrai più blocchi CDATA.

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

3

Potresti (dovresti?) Mettere la stringa in un file di risorse (ad esempio "Il mio progetto" / Risorse) e poi ottenerlo con

 Dim a = My.Resources.Whatever_you_chose

3

Disclaimer: amo Python. Le stringhe multilinea sono solo una delle ragioni.

Ma faccio anche VB.Net, quindi ecco la mia scorciatoia per stringhe lunghe più leggibili.

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

1
Hai bisogno di _ alla fine della riga per ogni "Linea .." che sembra brutta.
Kenji Noguchi,

2
In realtà no. Le versioni successive di VB (2010 e successive penso?) Non richiedono un _ in molti casi, incluso l'esempio mostrato qui.
Darryl,

2

puoi usare XML per questo tipo

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

1

in Visual Studio 2010 (VB NET) provo quanto segue e funziona benissimo

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

Se hai bisogno di un valore letterale XML in VB.Net con una variabile del codice di linea, ecco come lo faresti:

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

Nota bene perché stai citando un letterale XML qui, non vedi XML menzionato nella domanda originale.
Kmeixner

0

Puoi anche usare la System.Text.StringBuilderclasse in questo modo:

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

Quindi ottieni la stringa multilinea usando:

sValue.ToString()

-1

Poiché questo è un problema di leggibilità, ho usato il seguente codice:

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

1
Questo non va bene. Hai appena creato 4 istanze di stringa
TS

Ho ereditato un codice VB6 legacy che devo trasferire su VB.NET che è pieno di questi! :( In questo caso preferisco sacrificare le prestazioni per mantenere la leggibilità.
Zac,

Non devi Puoi sempre concatenare senza riassegnare una variabile e formattare in quelle righe
TS

Nel mio caso non è applicabile passare alla sintassi corretta in quanto dovrei modificare un intero gruppo di codice e non c'è più tempo sul progetto.
Zac,

-1

Usa vbCrLfo vbNewLine. Funziona con MessageBox e molti altri controlli che ho testato.

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

Mostrerà due MessageBox identici con 2 righe.


-9

No, VB.NET non ha ancora una tale funzione. Sarà disponibile nella prossima iterazione di VB (Visual Basic 10) comunque ( link )


Sei sicuro? So che permetteranno dichiarazioni multilinea, ma consentiranno anche stringhe multilinea ? Voglio dire "ciao <nuova> mondo"?
Mehrdad Afshari,

1
La rimozione del carattere di continuazione della riga e le stringhe letterali multilinea sono caratteristiche diverse.
JaredPar,

-16

se è come C # (non ho installato VB.Net) puoi aggiungere il prefisso a una stringa con @

foo = @"Multiline
String"

questo è utile anche per cose come @ "C: \ Windows \ System32 \" - essenzialmente disattiva l'escaping e attiva multilinea.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.