Mehrzeilige Zeichenfolgen in VB.NET


144

Gibt es eine Möglichkeit, mehrzeilige Zeichenfolgen in VB.NET wie Python zu haben?

a = """
multi
line
string
"""

oder PHP?

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

Natürlich etwas, das nicht ist

"multi" & _
"line

1
Übrigens: '"multi" & _ <newline> "line"' ist ein String-Literal, nicht zwei. Es ist trotzdem hässlich.
Joel Coehoorn

Informationen zu C # finden Sie unter Code: Generieren mehrzeiliger String-Literale (Visual C #)
LCJ

Meine zwei Cent: In VS 2017 würde Ihr VB.NET-Code kompiliert.
20 Ꭰ ЯƎᗩ

Antworten:


222

Sie können XML-Literale verwenden , um einen ähnlichen Effekt zu erzielen:

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

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

Denken Sie daran, dass Sie bei Sonderzeichen einen CDATA-Block verwenden sollten:

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

UPDATE 2015:

Mehrzeilige Zeichenfolgenliterale wurden in Visual Basic 14 (in Visual Studio 2015 ) eingeführt. Das obige Beispiel kann nun wie folgt geschrieben werden:

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.

Details werden dem Roslyn New-Language-Features-in-VB-14- Github-Repository hinzugefügt .


Wie können Sie dort Variablen ersetzen? wie "a =" & someint & ","
Christopher Mahan

1
@Christopher - Ich finde es normalerweise besser lesbar, Token in die String-Konstante einzufügen und sie dann zu ersetzen. So s="... a=~someint~ ..."und dann s=s.Replace("~someint~', SomeInt).
Herb Caudill

Dies scheint bei der dynamischen Kompilierung nicht zu funktionieren: CodeDomProvider.CreateProvider ("VisualBasic"). CompileAssemblyFromFile (<Optionen>, <.vb-Datei mit der obigen Tricksyntax>) ... Irgendwelche Ideen? Ist das nur syntaktischer Zucker von VS 2010?
Chad

1
@romkyns Nicht wahr, ich habe herausgefunden, wie man CDATA verwendet und trotzdem mit <% =%> einbetten kann. Siehe hier
Nelson

1
Genial! Wie können Sie den Codeeinzug beibehalten, ohne ihn unter der neueren Syntax in das Literal einzufügen?
Panzercrisis

50

VB.Net hat keine solche Funktion und wird es auch nicht in Visual Studio 2010. Das Feature kommt , dass jirwin wird beziehe wird impliziter Zeilenfortsetzungs genannt. Es hat mit dem Entfernen des _ aus einer mehrzeiligen Anweisung oder einem mehrzeiligen Ausdruck zu tun. Dadurch entfällt die Notwendigkeit, eine mehrzeilige Zeichenfolge mit _ zu beenden. In VB ist jedoch noch kein mehrzeiliges Zeichenfolgenliteral vorhanden.

Beispiel für mehrzeilige Zeichenfolge

Visual Studio 2008

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

Visual Studio 2010

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

Wie funktioniert es dann für XML-Literale? Entweder ist es möglich, oder XML-Literale verwenden eine andere Technik - und wenn eine andere Technik, dann eine, die auf mehrzeilige Zeichenfolgen erweitert werden könnte.
Mellamokb

1
@mellamokb XML-Literale sind .. speziell für das Fehlen eines besseren Wortes. Der Compiler versteht sie und ermöglicht es ihnen daher, mehrere Zeilen implizit zu überspannen. Für mehrzeilige Zeichenfolgen wurde keine solche Unterstützung hinzugefügt. Das Hinzufügen einer solchen Unterstützung ist viel einfacher als XML-Literale, es hat die Messlatte für diese Version einfach nicht erreicht.
JaredPar

38

Ich habe diese Variante verwendet:

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

es erlaubt <> in der Zeichenfolge


1
Tolle Technik, aber möglicherweise müssen Sie Ihrem Projekt einige Verweise hinzufügen, damit es funktioniert. Siehe: msdn.microsoft.com/en-us/library/bb531455%28v=vs.90%29.aspx und stackoverflow.com/a/28654126/3175562
Mike

30

Mehrzeilige Zeichenfolgen sind seit Visual Studio 2015 verfügbar.

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

Sie können sie mit Zeichenfolgeninterpolation kombinieren , um die Nützlichkeit zu maximieren:

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

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

Beachten Sie, dass interpolierte Strings beginnen mit , $und Sie müssen kümmern ", {und }enthalten innen - wandeln sie in "", {{oder}} sind.

Hier sehen Sie die tatsächliche Syntaxhervorhebung interpolierter Teile des obigen Codebeispiels:

Geben Sie hier die Bildbeschreibung ein

Wenn Sie sich fragen, ob ihre Erkennung durch den Visual Studio-Editor auch mit Refactoring funktioniert (z. B. Massenumbenennung der Variablen), dann haben Sie Recht, Code Refactoring funktioniert mit diesen. Ganz zu schweigen davon, dass sie auch IntelliSense, Referenzzählung oder Code-Analyse unterstützen.


20

Mehrzeilige Zeichenfolgenliterale werden in Visual Basic 14.0 - https://roslyn.codeplex.com/discussions/571884 eingeführt

Sie können es dann in der VS2015-Vorschau ab sofort verwenden - http://www.visualstudio.com/en-us/downloads/visual-studio-2015-downloads-vs (beachten Sie, dass Sie VS2015 auch dann verwenden können, wenn Sie auf eine ältere Version abzielen Version des .NET Frameworks)

Dim multiline = "multi
line
string"

VB-Zeichenfolgen sind jetzt im Grunde die gleichen wie wörtliche C # -Strings - sie unterstützen keine Backslash-Escape-Sequenzen wie \ n und erlauben Zeilenumbrüche innerhalb des Strings, und Sie maskieren das Anführungszeichen mit doppelten Anführungszeichen ""


2
Vielen Dank, Lucian, dass Sie dem VB mehrzeilige Zeichenfolgen hinzugefügt haben. Vielleicht können Sie Ihre Antwort aktualisieren, da VS 2015 jetzt RTM ist. Und vielleicht können Sie auch jemanden in Ihrem Unternehmen anstupsen , um den zugehörigen MSDN-Artikel zu aktualisieren .
Miroxlav

14

Dies war ein wirklich hilfreicher Artikel für mich, aber niemand erwähnte, wie man verkettet wenn man einige Variablen senden möchte, was in 99% der Fälle erforderlich ist.

... <% = Variable %> ...

So geht's:

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


17
In diesem Fall möchten Sie eine Verkettung vermeiden und stattdessen SQL-Parameter verwenden, da diese besser gegen SQL-Injection-Angriffe geschützt sind. Ich kann jedoch sehen, dass dies für die dynamische SQL-Generierung nützlich ist (ohne Benutzereingaben weiterzugeben).
Chad Levy

10

Nun, da Sie auf Ihrer Python zu sein scheinen, kann ich vorschlagen, dass Sie Ihren Text in Python kopieren, wie:

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

dann mache ein:

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

oder

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

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

dann können Sie das zumindest kopieren und in Ihren VB-Code einfügen. Bonuspunkte, wenn Sie einen Hotkey binden (am schnellsten mit: Autohotkey ), um dies für alles zu tun, was sich in Ihrem Einfügepuffer befindet. Die gleiche Idee funktioniert gut für einen SQL-Formatierer.


8

Mehrzeilige Zeichenfolgenliterale in vb.net mithilfe der XElement-Klasse.

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

Für mich ist das das nervigste an VB als Sprache. Im Ernst, ich habe einmal den String in eine Datei geschrieben und Code geschrieben in der Art von:

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

Nur damit ich die Abfrage direkt auf dem SQL Server testen kann, wenn ich muss.

Meine derzeitige Methode besteht darin, eine gespeicherte Prozedur auf dem SQL Server zu verwenden und diese einfach aufzurufen, damit ich Parameter an die Abfrage usw. Übergeben kann


5

Ich habe herausgefunden, wie man sowohl <! [CDATA [als auch <% = für Variablen verwendet, damit Sie ohne Sorgen codieren können.

Grundsätzlich müssen Sie die CDATA-Tags vor der VB-Variablen beenden und anschließend erneut hinzufügen, damit die CDATA den VB-Code nicht erfasst. Sie müssen den gesamten Codeblock in ein Tag einschließen, da Sie mehrere CDATA-Blöcke haben.

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

3

Sie könnten (sollten?) Die Zeichenfolge in eine Ressourcendatei (z. B. "Mein Projekt" / Ressourcen) einfügen und dann mit abrufen

 Dim a = My.Resources.Whatever_you_chose

3

Haftungsausschluss: Ich liebe Python. Die mehrzeiligen Zeichenfolgen sind nur ein Grund.

Aber ich mache auch VB.Net, also hier ist meine Abkürzung für besser lesbare lange Saiten.

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

1
Sie benötigen _ am Zeilenende für jede "Zeile ..", die hässlich aussieht.
Kenji Noguchi

2
Eigentlich nicht. Spätere Versionen von VB (2010 und später, glaube ich?) Erfordern in vielen Fällen kein _, einschließlich des hier gezeigten Beispiels.
Darryl

2

Sie können XML dafür verwenden

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

1

In Visual Studio 2010 (VB NET) versuche ich Folgendes und funktioniert einwandfrei

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

Wenn Sie in VB.Net ein XML-Literal mit einer Zeilencodevariablen benötigen, gehen Sie folgendermaßen vor:

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

Beachten Sie, warum Sie hier ein XML-Literal erwähnen. XML wird in der ursprünglichen Frage nicht erwähnt.
Kmeixner

0

Sie können System.Text.StringBuilderclass auch folgendermaßen verwenden :

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

Dann erhalten Sie die mehrzeilige Zeichenfolge mit:

sValue.ToString()

-1

Da dies ein Problem mit der Lesbarkeit ist, habe ich den folgenden Code verwendet:

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

1
Das ist schlecht. Sie haben gerade 4 Instanzen von Zeichenfolgen erstellt
TS

Ich habe einen alten VB6-Code geerbt, den ich auf VB.NET portieren muss, der voll davon ist! :( In diesem Fall ziehe ich es vor, die Leistung zu opfern, um die Lesbarkeit zu gewährleisten.
Zac

Das musst du nicht. Sie können jederzeit verketten, ohne eine Variable neu zuzuweisen, und innerhalb dieser Zeilen formatieren
TS

In meinem Fall kann nicht auf die richtige Syntax umgeschaltet werden, da ich eine ganze Reihe von Codes ändern sollte und keine Zeit mehr für das Projekt bleibt.
Zac

-1

Verwenden Sie vbCrLfoder vbNewLine. Es funktioniert mit MessageBoxen und vielen anderen Steuerelementen, die ich getestet habe.

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

Es werden zwei identische MessageBoxen mit 2 Zeilen angezeigt.


-9

Nein, VB.NET verfügt noch nicht über eine solche Funktion. Es wird jedoch in der nächsten Iteration von VB (Visual Basic 10) verfügbar sein ( Link )


Bist du sicher? Ich weiß, dass sie mehrzeilige Anweisungen zulassen werden, aber werden sie auch mehrzeilige Zeichenfolgen zulassen ? Ich meine "Hallo <newline> Welt"?
Mehrdad Afshari

1
Das Entfernen von Zeilenfortsetzungszeichen und mehrzeiligen Literalzeichenfolgen sind verschiedene Merkmale.
JaredPar

-16

Wenn es wie C # ist (ich habe VB.Net nicht installiert), können Sie einem String @ voranstellen

foo = @"Multiline
String"

Dies ist auch nützlich für Dinge wie @ "C: \ Windows \ System32 \" - es deaktiviert im Wesentlichen das Escapezeichen und das Multiline.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.