VB.NETの複数行文字列


144

PythonのようなVB.NETに複数行の文字列を含める方法はありますか

a = """
multi
line
string
"""

またはPHP?

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

もちろん、そうではないもの

"multi" & _
"line

1
ところで、 '"multi"&_ <newline> "line"'は2 つではなく1つの文字列リテラルです。それでも醜いです。
Joel Coehoorn、2009


私の2セント:VS 2017では、VB.NETコードがコンパイルされます。
ᗩИᎠЯƎᗩ

回答:


222

XMLリテラルを使用して、同様の効果を実現できます。

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 14Visual 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& "、"のようなもの
クリストファー・マハン

1
@クリストファー-私は通常、トークンを文字列定数に入れて置き換える方が読みやすいと思います。だから、s="... a=~someint~ ..."当時とs=s.Replace("~someint~', SomeInt)
Herb Caudill、2011

これは動的コンパイルでは機能しないようです:CodeDomProvider.CreateProvider( "VisualBasic")。CompileAssemblyFromFile(<options>、<上記のトリック構文を含む.vbファイル>)...何かアイデアはありますか?これは単にVS 2010構文糖ですか?
Chad

1
@romkyns真実ではありません。CDATAの使用方法を理解しましたが、<%=%>を使用して埋め込むことができます。ここを
Nelson

1
驚くばかり!新しい構文の下でリテラルに導入せずに、コードのインデントをどのように維持しますか?
Panzercrisis 2016年

50

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 2013

1
@mellamokb XMLリテラルは、より良い単語がないために特別です。コンパイラはそれらを理解するため、暗黙的に複数行にまたがることができます。このようなサポートは、複数行の文字列には追加されませんでした。このようなサポートを追加することは、XMLリテラルよりもはるかに簡単です。そのリリースの基準を満たしていないだけです。
JaredPar 2013

38

私はこのバリアントを使用しました:

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

文字列に<>を使用できます


1
素晴らしいテクニックですが、プロジェクトを機能させるには、プロジェクトにいくつかの参照を追加する必要がある場合があります。参照: msdn.microsoft.com/en-us/library/bb531455%28v=vs.90%29.aspxおよびstackoverflow.com/a/28654126/3175562
Mike

30

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、参照カウント、またはコード分析もサポートしていることは言及していません。


20

複数行文字列リテラルがVisual Basic 14.0で導入されました-https ://roslyn.codeplex.com/discussions/57188​​4

あなたは今、VS2015プレビューで、その後出て使用することができます- http://www.visualstudio.com/en-us/downloads/visual-studio-2015-downloads-vs(古いをターゲットにしたときにもまだVS2015を使用できることに注意してください.NETフレームワークのバージョン)

Dim multiline = "multi
line
string"

VB文字列は基本的にC#の逐語的文字列と同じになりました-それらは\ nのようなバックスラッシュエスケープシーケンスをサポートせず、文字列内の改行を許可し、二重引用符 ""で引用記号をエスケープします


2
VBに複数行の文字列を追加していただき、ありがとうございます。たぶん、VS 2015がRTMになったので、答えを更新できます。また、関連するMSDN記事を更新するために、社内の誰かを突くこともできます。
miroxlav 2015

14

これは私にとって本当に役立つ記事でしたが、99%の時間で実行する必要がある変数を送信する場合に連結する方法については誰も言及していません。

... <%=変数%> ...

方法は次のとおりです。

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


17
この場合、連結を回避し、代わりにSQLパラメーターを使用します。SQLパラメーターは、SQLインジェクション攻撃に対する強化に優れているためです。ただし、これは動的SQL生成に役立ちます(ユーザー入力を渡さなくても)。
Chad Levy

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フォーマッターでもうまく機能します。


8

XElementクラスを使用したvb.netの複数行の文字列リテラル。

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

私にとってそれは言語としてのVBの最も厄介なことです。真剣に、私はかつてファイルに文字列を書いて、次の行に沿ってコードを書きました:

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

必要に応じて、SQLサーバーでクエリを直接テストできます。

私の現在の方法は、SQL Serverでストアドプロシージャを使用してそれを呼び出すだけで、クエリにパラメーターを渡すことができます。


5

<![CDATA [と変数の<%=の両方を使用する方法を理解したので、心配することなくコーディングできます。

基本的に、CDATAタグがVB変数の前に終了し、その後に再度追加して、CDATAがVBコードをキャプチャしないようにする必要があります。複数のCDATAブロックがあるので、コードブロック全体をタグで囲む必要があります。

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

3

あなたは(すべきですか?)文字列をリソースファイル(例えば「My Project」/ Resources)に入れてからそれを得ることができます

 Dim a = My.Resources.Whatever_you_chose

3

免責事項:私はパイソンが大好きです。複数行の文字列が理由の1つにすぎません。

しかし、私はVB.Netも行うので、ここでは、より読みやすい長い文字列のショートカットを示します。

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

1
見苦しい各 "Line .."の行末に_が必要です。
野口健二

2
実際にはそうではありません。VBのそれ以降のバージョン(2010年以降と思いますか?)では、ここに示す例を含め、多くの場合_は必要ありません。
ダリル


1

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>


0

VB.Netでラインコード変数を使用してXMLリテラルが必要な場合は、次のようにします。

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

ここでXMLリテラルについて言及している理由に注意してください。元の質問で言及されているXMLを見ないでください。
Kmeixner 2016

0

System.Text.StringBuilderこの方法でクラスを使用することもできます:

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

次に、次を使用して複数行の文字列を取得します。

sValue.ToString()

-1

これは読みやすさの問題なので、次のコードを使用しました。

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

1
これは悪いです。ストリングの4つのインスタンスを作成しました
TSの

私はこれらでいっぱいのVB.NETに移植しなければならないレガシーVB6コードを継承しました!:(この場合、私は読みやすさを維持するために、性能を犠牲にすることを好む。
ザック

する必要はありません。変数を再割り当てせずに常に連結し、それらの
TS

私の場合、コードの完全な束を変更する必要があり、プロジェクトに時間がないため、正しい構文に切り替えることはできません。
Zac

-1

vbCrLfまたはを使用しvbNewLineます。MessageBoxesおよび私がテストした他の多くのコントロールで動作します。

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

2行で2つの同一のメッセージボックスが表示されます。


-9

いいえ、VB.NETにはまだそのような機能はありません。VB(Visual Basic 10)の次のイテレーションで使用できるようになります(リンク


確信してるの?彼らは複数行のステートメントを許可するつもりですが、複数行の文字列も許可するのでしょうか?「こんにちは<newline> world」ですか?
Mehrdad Afshari、

1
行継続文字と複数行リテラル文字列の削除は異なる機能です。
JaredPar 2009

-16

C#のような場合(VB.Netがインストールされていません)、@を文字列の前に付けることができます

foo = @"Multiline
String"

これは、@ "C:\ Windows \ System32 \"などの場合にも役立ちます。基本的に、エスケープがオフになり、複数行がオンになります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.