it-swarm.com.de

Einzelne Anweisung über mehrere Zeilen in VB.NET ohne den Unterstrich

Gibt es eine Möglichkeit, eine Aussage über mehrere Zeilen ohne den Unterstrich zu machen?

Bei mehrzeiligen Zeichenfolgen wie SQL-Anweisungen und insbesondere bei LINQ -Anfragen ist dies sehr ärgerlich.

Abgesehen von der Hässlichkeit und Schwierigkeit beim Ändern einer Zeile (es steht nichts mehr in einer Zeile), können Sie keine Kommentare in der Mitte der mehrzeiligen Anweisung verwenden.

Beispiele meiner täglichen persönlichen Hölle.

dim results = from a in articles _
              where a.articleID = 4 _ ' articleID     - Nope, can't do this
              select a.articleName


dim createArticle as string = _
    "Create table article " & _
    "    (articleID int " & _
    "    ,articleName varchar(50) " & _
    "    )"
35
Shawn

Nein, Sie müssen den Unterstrich verwenden, aber ich glaube, dass VB.NET 10 mehrere Zeilen ohne den Unterstrich zulässt. Dies ist nur erforderlich, wenn nicht herausgefunden werden kann, wo das Ende sein soll.

40
Booji Boy

Bei den meisten mehrzeiligen Zeichenfolgen ist es einfacher, ein XML-Element mit einem inneren CDATA-Block zu verwenden, um zu vermeiden, dass für einfache unformatierte Zeichenfolgendaten ein Escape-Vorgang ausgeführt werden muss.

Dim s as string = <s><![CDATA[Line 1
line 2
line 3]]></s>.Value

Beachten Sie, dass viele Leute dasselbe Format angegeben haben, jedoch ohne das Umbruch-Tag "<s>" (nur der CDATA-Block), aber mit Visual Studio. Ich denke, das liegt an der Objektvererbungsstruktur hinter den Linq "X" -Objekten. CDATA ist kein "Container", der äußere Block ist ein XElement, das von XContainer erbt.

5
Darren

Ab VB.NET 10 wird Fortsetzung impliziter Zeilen für eine Reihe von Syntaxelementen unterstützt (siehe Anweisungen in Visual Basic: Fortsetzung einer Anweisung über mehrere Zeilen ). Der Verkettungsoperator (&) befindet sich in der Liste der Syntaxelemente, die die Fortsetzung impliziter Zeilen unterstützen. Eingestreute Kommentare werden ebenfalls unterstützt, sodass Ihr zweites Beispiel wie folgt umgeschrieben werden könnte:

dim createArticle as string = 
    "Create table article " &
    "    (articleID int " &           ' Comment for articleID
    "    ,articleName varchar(50) " & ' Comment for articleName
    "    )"

Implizite Zeilenfortsetzung funktioniert mit einigen Einschränkungen auch für Abfrageoperatoren:

Vor und nach Abfrageoperatoren ( Aggregieren , Unterscheiden , Von , Gruppieren nach , Gruppieren beitreten , Join , Let , Sortieren nach , Wählen Sie , Überspringen , Skip While , Take , Take While , Where , In , In , Ein , Aufsteigend und Absteigend ). Sie können keine Trennlinie zwischen den Schlüsselwörtern von Abfrageoperatoren setzen, die aus mehreren Schlüsselwörtern ( Order By , Group bestehen Join , Take While und Skip While ).

Auch hier sind eingestreute Kommentare zulässig, sodass Ihr erstes Beispiel wie folgt umgeschrieben werden kann:

dim results = from a in articles
              where a.articleID = 4  ' articleID - now perfectly legal
              select a.articleName
4
IInspectable

Ich werde nein sagen.

Aber der einzige Beweis, den ich habe, ist persönliche Erfahrung und die Tatsache, dass die Online-Dokumentation nichts anderes enthält.

http://msdn.Microsoft.com/en-us/library/aa711641 (VS.71) .aspx

4
Nathan Koop

Ich weiß, dass dies eine akzeptierte Antwort hat, aber es ist der Top-Artikel, den ich bei der Suche nach dieser Frage gefunden habe, und er ist jetzt sehr veraltet. Ich habe ein wenig mehr nachgeforscht und dieser MSDN-Artikel enthält eine Liste von Syntaxelementen, mit denen die Anweisung in der nächsten Codezeile für VB.Net 2010 implizit fortgesetzt wird.

1
Pandelon

Ich bin nicht sicher, ob Sie das mit mehrzeiligem Code tun können, aber mehrzeilige Variablen können getan werden:

Mehrzeilige Zeichenfolgen in VB.NET

Hier ist der relevante Teil:

Ich habe herausgefunden, wie man beide <! [CDATA [zusammen mit <% = für Variablen verwendet, wodurch man ohne Bedenken codieren kann.

Grundsätzlich müssen Sie die CDATA-Tags vor der Variablen VB beenden und anschließend neu hinzufügen, damit die CDATA den VB= - Code nicht erfasst Wickeln Sie den gesamten Codeblock in ein Tag, 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
1
Nelson

Nein, der Unterstrich ist das einzige Fortsetzungszeichen. Persönlich bevorzuge ich die gelegentliche Verwendung eines Fortsetzungszeichens, anstatt es immer wie in C # verwenden zu müssen, aber abgesehen von den Kommentaren (was meiner Meinung nach manchmal ärgerlich ist), ist es kein Problem, Dinge zum Ausrichten zu bringen.

In jedem Fall müssen Sie bei VS2008 nur die zweite und die folgenden Zeilen auswählen, die Tabulatortaste mehrmals drücken und das gesamte Los wird verschoben.

Wenn es ein bisschen zu weit geht, können Sie das überschüssige Leerzeichen eines Zeichens gleichzeitig löschen. Es ist ein bisschen fummelig, aber es bleibt stehen, sobald es gespeichert ist.

In den seltenen Fällen, in denen dies nicht gut genug ist, verwende ich manchmal die folgende Technik, um alles in Einklang zu bringen:

dim results as String = ""
results += "from a in articles "
results += "where a.articleID = 4 " 'and now you can add comments
results += "select a.articleName"

Es ist nicht perfekt, und ich weiß, dass diejenigen, die C # bevorzugen, Tut-Tutting sein werden, aber da ist es. Es ist eine Stilwahl, aber ich bevorzuge sie immer noch endlosen Semikolons.

Jetzt warte ich nur noch darauf, dass mir jemand sagt, ich hätte einen StringBuilder verwenden sollen ;-)

1
ChrisA

Sie können XML-Literale verwenden, um dies zu tun:

Dim s = <sql>
  Create table article
  (articleID int  -- sql comment
  ,articleName varchar(50)  <comment text="here's an xml comment" />
  )
</sql>.Value

warnung: Es gelten XML-Textregeln wie bei amp. für kaufmännisches Und, lt; für <usw.

Dim alertText = "Hello World"
Dim js = <script>
          $(document).ready(function() {
           alert('<%= alertText %>');
          });
         </script>.ToString  'instead of .Value includes <script> tag

hinweis: Das obige ist problematisch, wenn es Zeichen enthält, die maskiert werden müssen. Besser zu benutzen "<script>"+js.Value+"</script>"

0
Hafthor