String multiline di VB.NET


144

Apakah ada cara untuk memiliki string multiline di VB.NET seperti Python

a = """
multi
line
string
"""

atau PHP?

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

Tentu saja sesuatu yang bukan

"multi" & _
"line

1
BTW: '"multi" & _ <newline> "line"' adalah satu string literal, bukan dua. Tapi tetap saja jelek.
Joel Coehoorn


Dua sen saya: di VS 2017 kode VB.NET Anda akan dikompilasi.
ᗩИ Ꭰ ЯƎᗩ

Jawaban:


222

Anda dapat menggunakan XML Literals untuk mencapai efek yang serupa:

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

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

Ingat bahwa jika Anda memiliki karakter khusus, Anda harus menggunakan blok CDATA:

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

PEMBARUAN 2015:

Multi-line string literal diperkenalkan dalam Visual Basic 14 (dalam Visual Studio 2015 ). Contoh di atas sekarang dapat ditulis sebagai:

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.

Rincian ditambahkan ke Roslyn Baru-Bahasa-Fitur-in-VB-14 Github repositori.


bagaimana Anda bisa melakukan penggantian variabel di sana? seperti "a =" & someint & ","
Christopher Mahan

1
@ Christopher - Saya biasanya merasa lebih mudah dibaca untuk menempatkan token di string konstan, dan kemudian menggantinya. Jadi s="... a=~someint~ ..."lalu s=s.Replace("~someint~', SomeInt).
Herb Caudill

Tampaknya ini tidak berfungsi dengan kompilasi dinamis: CodeDomProvider.CreateProvider ("VisualBasic"). CompileAssemblyFromFile (<options>, <.vb file dengan sintaks trik di atas di dalamnya>) ... Ada ide? Apakah ini hanya gula sintaksis VS 2010?
Chad

1
@romkyns Tidak benar, saya menemukan cara menggunakan CDATA dan masih dapat menanamkan menggunakan <% =%> Lihat di sini
Nelson

1
Luar biasa! Bagaimana Anda mempertahankan lekukan kode tanpa memasukkannya ke dalam literal di bawah sintaksis yang lebih baru?
Panzercrisis

50

VB.Net tidak memiliki fitur seperti itu dan tidak akan hadir di Visual Studio 2010. Fitur yang dirujuk oleh jirwin disebut kelanjutan garis implisit. Itu ada hubungannya dengan menghapus _ dari pernyataan atau ekspresi multi-line. Ini menghapus kebutuhan untuk mengakhiri string multiline dengan _ tetapi masih belum ada string mult-line literal di VB.

Contoh untuk string multiline

Visual Studio 2008

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

Visual Studio 2010

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

Jadi bagaimana cara kerjanya untuk XML literal? Entah itu mungkin, atau XML literal menggunakan teknik yang berbeda - dan jika teknik yang berbeda, maka yang dapat diperluas ke string multi-line.
mellamokb

1
@mellamokb XML literals adalah .. khusus karena tidak ada kata yang lebih baik. Compiler mengerti mereka dan karenanya akan memungkinkan mereka untuk span beberapa baris secara implisit. Tidak ada dukungan seperti itu ditambahkan untuk string multi-line. Menambahkan dukungan seperti itu jauh lebih mudah daripada literal XML, itu hanya tidak memenuhi bilah untuk rilis itu.
JaredPar

38

Saya menggunakan varian ini:

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

itu memungkinkan <> dalam string


1
Teknik yang hebat, tetapi orang mungkin harus menambahkan beberapa referensi ke proyek Anda untuk membuatnya bekerja. Lihat: msdn.microsoft.com/en-us/library/bb531455%28v=vs.90%29.aspx dan stackoverflow.com/a/28654126/3175562
Mike

30

String multi-line tersedia sejak Visual Studio 2015.

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

Anda dapat menggabungkannya dengan interpolasi string untuk memaksimalkan kegunaan:

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

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

Perhatikan bahwa string interpolasi dimulai dengan $dan Anda perlu mengurus ", {dan }terkandung di dalamnya - mengubahnya menjadi "", {{atau }}masing - masing.

Di sini Anda dapat melihat penyorotan sintaksis sebenarnya dari bagian-bagian yang diinterpolasi dari contoh kode di atas:

masukkan deskripsi gambar di sini

Jika Anda bertanya-tanya apakah pengakuan mereka oleh editor Visual Studio juga bekerja dengan refactoring (mis. Mengubah nama variabel secara massal), maka Anda benar, kode refactoring berfungsi dengan ini. Tidak menyebutkan bahwa mereka juga mendukung IntelliSense, penghitungan referensi atau analisis kode.


20

Literal string multiline diperkenalkan dalam Visual Basic 14.0 - https://roslyn.codeplex.com/discussions/571884

Anda dapat menggunakannya saat itu di VS2015 Preview, keluar sekarang - http://www.visualstudio.com/en-us/downloads/visual-studio-2015-downloads-vs (perhatikan bahwa Anda masih dapat menggunakan VS2015 bahkan ketika menargetkan yang lebih tua versi kerangka .NET)

Dim multiline = "multi
line
string"

String VB pada dasarnya sekarang sama dengan string C # verbatim - mereka tidak mendukung urutan pelarian backslash seperti \ n, dan mereka mengizinkan baris baru dalam string, dan Anda keluar dari simbol kutipan dengan tanda kutip ganda ""


2
Terima kasih Lucian karena menambahkan string multi-line ke dalam VB. Mungkin Anda dapat memperbarui jawaban Anda, karena VS 2015 sekarang RTM. Dan mungkin Anda juga dapat menyodok seseorang di perusahaan Anda untuk memperbarui artikel MSDN terkait .
miroxlav

14

ini adalah artikel yang sangat membantu bagi saya, tetapi tidak ada yang menyebutkan cara menggabungkan jika Anda ingin mengirim beberapa variabel, yang perlu Anda lakukan 99% dari waktu.

... <% = variabel %> ...

Begini cara melakukannya:

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


17
Dalam hal ini, Anda ingin menghindari penggabungan dan bukannya menggunakan parameter SQL karena mereka lebih baik dalam pengerasan terhadap serangan injeksi SQL. Saya bisa melihat ini berguna untuk generasi SQL dinamis, (tanpa meneruskan input pengguna).
Chad Levy

10

Nah, karena Anda tampaknya menggunakan python, bolehkah saya menyarankan Anda menyalin teks Anda ke python, seperti:

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

lalu lakukan:

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

atau

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

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

maka setidaknya Anda bisa menyalinnya dan memasukkannya ke dalam kode VB Anda. Poin bonus jika Anda mengikat hotkey (tercepat untuk mendapatkan dengan: Autohotkey ) untuk melakukan ini untuk apa pun yang ada di buffer pasta Anda. Ide yang sama bekerja dengan baik untuk formatter SQL.


8

Literal string multi-line di vb.net menggunakan kelas 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

Bagi saya itu adalah hal yang paling menyebalkan tentang VB sebagai bahasa. Serius, saya pernah menulis string dalam file dan menulis kode sesuatu di sepanjang baris:

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

hanya supaya saya bisa menguji permintaan langsung pada SQL server jika saya perlu.

Metode saya saat ini adalah dengan menggunakan prosedur tersimpan pada SQL Server dan panggil saja agar saya dapat mengirimkan parameter ke kueri, dll


5

Saya menemukan cara menggunakan keduanya <! [CDATA [bersama dengan <% = untuk variabel, yang memungkinkan Anda untuk kode tanpa khawatir.

Anda pada dasarnya harus menghentikan tag CDATA sebelum variabel VB dan kemudian menambahkannya kembali sehingga CDATA tidak menangkap kode VB. Anda perlu membungkus seluruh blok kode dalam sebuah tag karena Anda akan memiliki beberapa blok CDATA.

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

3

Anda bisa (harus?) Meletakkan string dalam file sumber daya (mis. "Proyek Saya" / Sumber Daya) dan kemudian mendapatkannya

 Dim a = My.Resources.Whatever_you_chose

3

Penafian: Saya suka python. Ini string multi-line hanya satu alasan.

Tapi saya juga melakukan VB.Net, jadi inilah jalan pintas saya untuk string panjang yang lebih mudah dibaca.

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

1
Anda perlu _ di akhir baris untuk setiap "Baris .." yang terlihat jelek.
Kenji Noguchi

2
Sebenarnya kamu tidak. Versi selanjutnya dari VB (2010 dan kemudian saya pikir?) Tidak memerlukan _ dalam banyak kasus, termasuk contoh yang ditunjukkan di sini.
Darryl

2

Anda dapat menggunakan XML untuk seperti ini

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

1

di Visual studio 2010 (VB NET) saya mencoba yang berikut dan berfungsi dengan baik

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

Jika Anda memerlukan XML literal di VB.Net dengan variabel kode baris, ini adalah bagaimana Anda akan melakukannya:

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

Catat yakin mengapa Anda menyebutkan XML literal di sini, jangan lihat XML disebutkan dalam pertanyaan awal.
Kmeixner

0

Anda juga dapat menggunakan System.Text.StringBuilderkelas dengan cara ini:

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

Kemudian Anda mendapatkan string multiline menggunakan:

sValue.ToString()

-1

Karena ini adalah masalah keterbacaan, saya telah menggunakan kode berikut:

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

1
Ini buruk. Anda baru saja membuat 4 instance string
TS

Saya mewarisi kode warisan VB6 yang harus saya porting ke VB.NET yang penuh dengan ini! :( Dalam hal ini saya lebih suka mengorbankan kinerja untuk menjaga keterbacaan.
Zac

Anda tidak harus melakukannya. Anda selalu dapat menggabungkan tanpa menetapkan ulang variabel, dan memformat dalam baris tersebut
TS

Dalam kasus saya tidak berlaku untuk beralih ke sintaks yang benar karena saya harus memodifikasi banyak kode dan tidak ada waktu tersisa pada proyek.
Zac

-1

Gunakan vbCrLfatau vbNewLine. Ini bekerja dengan MessageBoxes dan banyak kontrol lain yang saya uji.

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

Ini akan menampilkan dua MessageBox identik dengan 2 baris.


-9

Tidak, VB.NET belum memiliki fitur seperti itu. Akan tersedia dalam iterasi VB berikutnya (visual basic 10) ( tautan )


Kamu yakin? Saya tahu mereka akan mengizinkan pernyataan multiline, tetapi apakah mereka akan mengizinkan string multiline juga? Maksud saya "halo <newline> dunia"?
Mehrdad Afshari

1
Penghapusan karakter kelanjutan garis dan string literal multi-baris adalah fitur yang berbeda.
JaredPar

-16

jika itu seperti C # (saya tidak memiliki VB.Net diinstal) Anda dapat awalan string dengan @

foo = @"Multiline
String"

ini juga berguna untuk hal-hal seperti @ "C: \ Windows \ System32 \" - ini pada dasarnya mematikan melarikan diri dan menghidupkan multiline.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.