Chuỗi đa dòng trong VB.NET


144

Có cách nào để có các chuỗi nhiều dòng trong VB.NET như Python không

a = """
multi
line
string
"""

hay PHP?

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

Tất nhiên một cái gì đó không phải là

"multi" & _
"line

1
BTW: '"multi" & _ <newline> "line"' là một chuỗi bằng chữ, không phải hai. Mặc dù vậy, nó vẫn xấu.
Joel Coehoorn


Hai xu của tôi: trong VS 2017, mã VB.NET của bạn sẽ được biên dịch.
ᗩИ Ꭰ

Câu trả lời:


222

Bạn có thể sử dụng XML Literals để đạt được hiệu ứng tương tự:

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

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

Hãy nhớ rằng nếu bạn có các ký tự đặc biệt, bạn nên sử dụng khối CDATA:

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

CẬP NHẬT 2015:

Chuỗi ký tự nhiều dòng được giới thiệu trong Visual Basic 14 (trong Visual Studio 2015 ). Ví dụ trên có thể được viết là:

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.

Thông tin chi tiết được thêm vào kho lưu trữ Rosith New-Language-Feature-in-VB-14 Github.


Làm thế nào bạn có thể thay thế trong đó? như "a =" & someint & ","
Christopher Mahan

1
@Christopher - Tôi thường thấy dễ đọc hơn khi đặt mã thông báo trong hằng chuỗi, sau đó thay thế chúng. Vì vậy s="... a=~someint~ ...", sau đó s=s.Replace("~someint~', SomeInt).
Herb Caudill

Điều này dường như không hoạt động với trình biên dịch động: CodeDomProvider.CreateProvider ("VisualBasic"). Đây chỉ là đường cú pháp VS 2010?
Chad

1
@romkyns Không đúng, tôi đã tìm ra cách sử dụng CDATA và vẫn có thể nhúng bằng <% =%> Xem tại đây
Nelson

1
Tuyệt vời! Làm thế nào để bạn duy trì thụt mã mà không đưa nó vào nghĩa đen theo cú pháp mới hơn?
Panzercrisis

50

VB.Net không có tính năng này và nó sẽ không xuất hiện trong Visual Studio 2010. Tính năng mà jirwin đang giới thiệu được gọi là tiếp tục dòng ngầm. Nó phải thực hiện với việc loại bỏ _ khỏi một câu lệnh hoặc biểu thức nhiều dòng. Điều này không loại bỏ sự cần thiết phải chấm dứt một chuỗi nhiều dòng bằng _ nhưng vẫn không có chuỗi ký tự nhiều dòng trong VB.

Ví dụ cho chuỗi đa dòng

Phòng thu hình ảnh 2008

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

Studio hình ảnh 2010

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

Vậy thì nó hoạt động như thế nào đối với các chữ XML? Có thể là có thể, hoặc các chữ XML đang sử dụng một kỹ thuật khác - và nếu một kỹ thuật khác, thì một kỹ thuật có thể được mở rộng thành các chuỗi nhiều dòng.
mellamokb

1
@mellamokb nghĩa đen XML là .. đặc biệt vì thiếu một từ tốt hơn. Trình biên dịch hiểu chúng và do đó sẽ cho phép chúng trải rộng nhiều dòng ngầm. Không có hỗ trợ như vậy đã được thêm vào cho chuỗi nhiều dòng. Thêm hỗ trợ như vậy là nhiều dễ dàng hơn literals XML, nó chỉ không đáp ứng thanh cho phát hành đó.
JaredPar

38

Tôi đã sử dụng biến thể này:

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

nó cho phép <> trong chuỗi


1
Kỹ thuật tuyệt vời, nhưng người ta có thể phải thêm một số tài liệu tham khảo cho dự án của bạn để làm cho nó hoạt động. Xem: msdn.microsoft.com/en-us/l Library / bb531455% 28v = vs.90% 29.aspxstackoverflow.com/a/28654126/3175562
Mike

30

Chuỗi nhiều dòng có sẵn kể từ Visual Studio 2015.

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

Bạn có thể kết hợp chúng với phép nội suy chuỗi để tối đa hóa sự hữu ích:

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

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

Lưu ý rằng chuỗi nội suy bắt đầu với $và bạn cần phải chăm sóc ", {}chứa đựng bên trong - chuyển đổi chúng thành "", {{hoặc }}tương ứng.

Ở đây bạn có thể thấy đánh dấu cú pháp thực tế của các phần được nội suy của ví dụ mã trên:

nhập mô tả hình ảnh ở đây

Nếu bạn tự hỏi liệu trình nhận dạng Visual Studio của họ có hoạt động với tái cấu trúc không (ví dụ đổi tên hàng loạt các biến), thì bạn đã đúng, tái cấu trúc mã hoạt động với các biến này. Không đề cập đến việc họ cũng hỗ trợ IntelliSense, đếm tham chiếu hoặc phân tích mã.


20

Chuỗi ký tự nhiều dòng được giới thiệu trong Visual Basic 14.0 - https://roslyn.codeplex.com/discussions/571884

Bạn có thể sử dụng sau đó trong Bản xem trước VS2015, ngay bây giờ - http://www.visualstudio.com/en-us/doads/visual-studio-2015-doads-vs (lưu ý rằng bạn vẫn có thể sử dụng VS2015 ngay cả khi nhắm mục tiêu cũ phiên bản của .NET framework)

Dim multiline = "multi
line
string"

Các chuỗi VB về cơ bản bây giờ giống như các chuỗi nguyên văn C # - chúng không hỗ trợ các chuỗi thoát dấu gạch chéo ngược như \ n và chúng cho phép các dòng mới trong chuỗi và bạn thoát biểu tượng trích dẫn bằng dấu ngoặc kép ""


2
Cảm ơn Lucian vì đã thêm các chuỗi nhiều dòng vào VB. Có lẽ bạn có thể cập nhật câu trả lời của mình, vì VS 2015 hiện là RTM. Và có lẽ bạn cũng có thể chọc ai đó trong công ty của bạn để cập nhật bài viết MSDN liên quan .
miroxlav

14

đây là một bài viết thực sự hữu ích cho tôi, nhưng không ai đề cập đến cách nối trong trường hợp bạn muốn gửi một số biến, đó là điều bạn cần làm 99% thời gian.

... <% = biến %> ...

Đây là cách bạn làm điều đó:

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


17
Trong trường hợp này, bạn muốn tránh ghép nối và thay vào đó sử dụng các tham số SQL vì chúng tốt hơn trong việc tăng cường chống lại các cuộc tấn công tiêm nhiễm SQL. Tuy nhiên, tôi có thể thấy điều này hữu ích cho việc tạo SQL động (mà không chuyển qua đầu vào của người dùng).
Chad Levy

10

Chà, vì dường như bạn đang ở trên con trăn của mình, tôi có thể đề nghị bạn sao chép văn bản của bạn vào con trăn, như:

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

sau đó làm một:

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

hoặc là

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

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

sau đó ít nhất bạn có thể sao chép nó ra và đặt nó vào mã VB của bạn. Điểm thưởng nếu bạn liên kết một phím nóng (nhanh nhất để có được: Autohotkey ) để làm điều này cho bất cứ điều gì có trong bộ đệm dán của bạn. Ý tưởng tương tự hoạt động tốt cho một trình định dạng SQL.


8

Chuỗi ký tự nhiều dòng trong vb.net bằng cách sử dụng lớp XEuity.

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

Đối với tôi đó là điều khó chịu nhất về VB như một ngôn ngữ. Nghiêm túc mà nói, tôi đã từng viết chuỗi trong một tập tin và viết mã gì đó dọc theo dòng:

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

chỉ để tôi có thể kiểm tra truy vấn trực tiếp trên máy chủ SQL nếu tôi cần.

Phương pháp hiện tại của tôi là sử dụng một thủ tục được lưu trữ trên SQL Server và chỉ cần gọi nó để tôi có thể truyền tham số cho truy vấn, v.v.


5

Tôi đã tìm ra cách sử dụng cả <! [CDATA [cùng với <% = cho các biến, cho phép bạn viết mã mà không phải lo lắng.

Về cơ bản, bạn phải chấm dứt các thẻ CDATA trước biến VB và sau đó thêm lại nó sau để CDATA không thu được mã VB. Bạn cần phải bọc toàn bộ khối mã trong một thẻ vì bạn sẽ có nhiều khối CDATA.

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

3

Bạn có thể (nên?) Đặt chuỗi vào tệp tài nguyên (ví dụ: "Dự án của tôi" / Tài nguyên) và sau đó lấy chuỗi đó với

 Dim a = My.Resources.Whatever_you_chose

3

Tuyên bố từ chối trách nhiệm: Tôi yêu trăn. Đó là chuỗi nhiều dòng chỉ là một lý do.

Nhưng tôi cũng làm VB.Net, vì vậy đây là phần rút gọn của tôi để có chuỗi dài dễ đọc hơn.

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

1
Bạn cần _ ở cuối dòng cho mỗi "Dòng .." trông xấu.
Kenji Noguchi

2
Thật ra bạn không. Các phiên bản sau của VB (2010 và sau này tôi nghĩ vậy?) Không yêu cầu _ trong rất nhiều trường hợp, bao gồm cả ví dụ được hiển thị ở đây.
Darryl

2

bạn có thể sử dụng XML cho việc này như thế nào

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

1

trong Visual studio 2010 (VB NET) tôi thử các cách sau và hoạt động tốt

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

Nếu bạn cần một chữ XML trong VB.Net với biến mã dòng, đây là cách bạn sẽ làm điều đó:

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

Lưu ý chắc chắn lý do tại sao bạn đề cập đến một nghĩa đen XML ở đây, không thấy XML được đề cập trong câu hỏi ban đầu.
Kmeixner

0

Bạn cũng có thể sử dụng System.Text.StringBuilderlớp theo cách này:

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

Sau đó, bạn nhận được chuỗi multiline bằng cách sử dụng:

sValue.ToString()

-1

Vì đây là vấn đề dễ đọc, tôi đã sử dụng đoạn mã sau:

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

1
Điều này tệ đây. Bạn vừa tạo 4 phiên bản của chuỗi
TS

Tôi đã kế thừa mã VB6 kế thừa mà tôi phải chuyển sang VB.NET chứa đầy những mã này! :( Trong trường hợp này, tôi thích hy sinh hiệu suất để duy trì khả năng đọc.
Zac

Bạn không cần phải làm vậy. Bạn luôn có thể nối mà không cần gán lại một biến và định dạng trong các dòng đó
TS

Trong trường hợp của tôi không áp dụng được để chuyển sang cú pháp đúng vì tôi nên sửa đổi một loạt mã đầy đủ và không còn thời gian cho dự án.
Zac

-1

Sử dụng vbCrLfhoặc vbNewLine. Nó hoạt động với MessageBoxes và nhiều điều khiển khác mà tôi đã thử nghiệm.

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

Nó sẽ hiển thị hai MessageBoxes giống hệt nhau với 2 dòng.


-9

Không, VB.NET chưa có tính năng như vậy. Nó sẽ có sẵn trong lần lặp tiếp theo của VB (hình ảnh cơ bản 10) tuy nhiên ( liên kết )


Bạn chắc chắn? Tôi biết họ sẽ cho phép các tuyên bố đa dòng, nhưng họ cũng sẽ cho phép các chuỗi đa dòng phải không? Ý tôi là "xin chào <newline> thế giới"?
Mehrdad Afshari

1
Loại bỏ ký tự tiếp tục dòng và chuỗi ký tự nhiều dòng là các tính năng khác nhau.
JaredPar

-16

nếu nó giống như C # (Tôi chưa cài đặt VB.Net), bạn có thể thêm tiền tố vào một chuỗi với @

foo = @"Multiline
String"

điều này cũng hữu ích cho những thứ như @ "C: \ Windows \ System32 \" - về cơ bản nó sẽ tắt thoát và bật multiline.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.