สตริงหลายเส้นใน VB.NET


144

มีวิธีที่จะมีสตริงหลายบรรทัดใน VB.NET เช่น Python หรือไม่

a = """
multi
line
string
"""

หรือ PHP?

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

แน่นอนสิ่งที่ไม่

"multi" & _
"line

1
BTW: '"multi" & _ <newline> "line" "เป็นหนึ่งสตริงตัวอักษรไม่ใช่สอง มันยังน่าเกลียดอยู่ดี
Joel Coehoorn


สองเซ็นต์ของฉัน: ในปี 2560 รหัส VB.NET ของคุณจะถูกรวบรวม
ᗩИᎠЯƎᗩ

คำตอบ:


223

คุณสามารถใช้ตัวอักษร 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 14 (ในVisual 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.

โดยมีรายละเอียดเพิ่มให้กับโรสลินใหม่ภาษาคุณสมบัติใน-VB-14ที่เก็บ Github


คุณจะเปลี่ยนตัวแปรได้อย่างไร? เช่น "a =" & someint & ","
Christopher Mahan

1
@ คริสโตเฟอร์ - ปกติแล้วฉันจะพบว่าสามารถอ่านโทเค็นได้มากขึ้นในค่าคงที่สตริงแล้วแทนที่มัน ดังนั้นแล้วs="... a=~someint~ ..." s=s.Replace("~someint~', SomeInt)
สมุนไพร Caudill

สิ่งนี้ดูเหมือนจะไม่ทำงานกับการคอมไพล์แบบไดนามิก: CodeDomProvider.CreateProvider ("VisualBasic"). CompileAssemblyFromFile (<options>, ไฟล์ <.vb ที่มีไวยากรณ์ของกลอุบายข้างต้นอยู่ในนั้น>) ... ความคิดใด ๆ ? นี่เป็นเพียงน้ำตาลทราย VS VS 2010 หรือไม่
ชาด

1
@romkyns ไม่เป็นความจริงฉันรู้วิธีใช้ CDATA และยังสามารถฝังโดยใช้ <% =%> ดูที่นี่
Nelson

1
! น่ากลัว คุณจะรักษารหัสการเยื้องโดยไม่แนะนำในสัญพจน์ภายใต้ไวยากรณ์ที่ใหม่กว่าได้อย่างไร
Panzercrisis

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

1
@mellamokb ตัวอักษร XML เป็น .. พิเศษสำหรับการขาดคำที่ดีกว่า คอมไพเลอร์เข้าใจพวกเขาและด้วยเหตุนี้จะช่วยให้พวกเขาที่จะขยายหลายบรรทัดโดยปริยาย ไม่มีการเพิ่มการสนับสนุนดังกล่าวสำหรับสตริงหลายบรรทัด การเพิ่มการสนับสนุนดังกล่าวจะมากง่ายกว่าตัวอักษร XML มันก็ไม่เป็นไปตามบาร์สำหรับการเปิดตัวว่า
JaredPar

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 ยังทำงานร่วมกับ refactoring (เช่นมวลเปลี่ยนชื่อตัวแปร) แล้วคุณจะขวารหัส refactoring ทำงานร่วมกับเหล่านี้ ไม่พูดถึงว่าพวกเขายังสนับสนุน IntelliSense การนับการอ้างอิงหรือการวิเคราะห์รหัส


20

มีการแนะนำตัวอักษรสตริงหลายบรรทัดใน Visual Basic 14.0 - https://roslyn.codeplex.com/discussions/571884

คุณสามารถใช้ใน VS2015 Preview ได้แล้ววันนี้ - http://www.visualstudio.com/en-us/downloads/visual-studio-2015-downloads-vs (โปรดทราบว่าคุณยังคงสามารถใช้ VS2015 ได้แม้จะเป็นเป้าหมายที่เก่ากว่า เวอร์ชั่นของ. NET Framework)

Dim multiline = "multi
line
string"

โดยทั่วไปแล้วสตริง VB จะเหมือนกับสตริง C # verbatim ซึ่งไม่สนับสนุน backslash escape ดังนี้เช่น \ n และอนุญาตให้ขึ้นบรรทัดใหม่ภายในสตริงและคุณสามารถหลีกเลี่ยงเครื่องหมายคำพูดด้วยเครื่องหมายคำพูด ""


2
ขอบคุณ Lucian สำหรับการเพิ่มสตริงหลายบรรทัดลงใน VB บางทีคุณสามารถอัปเดตคำตอบของคุณได้เนื่องจาก VS 2015 ตอนนี้เป็น RTM และบางทีคุณอาจยังสามารถกระตุ้นใครสักคนใน บริษัท ของคุณเพื่ออัพเดทบทความ MSDN
miroxlav

14

นี่เป็นบทความที่มีประโยชน์มากสำหรับฉัน แต่ไม่มีใครพูดถึงวิธีการต่อข้อมูลในกรณีที่คุณต้องการส่งตัวแปรบางอย่างซึ่งเป็นสิ่งที่คุณต้องทำ 99% ของเวลา

... <% =ตัวแปร%> ...

นี่คือวิธีที่คุณทำ:

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


17
ในกรณีนี้คุณต้องการหลีกเลี่ยงการต่อข้อมูลและใช้พารามิเตอร์ SQL แทนเนื่องจากความแข็งของการโจมตี SQL injection จะดีกว่า ฉันเห็นว่าสิ่งนี้มีประโยชน์สำหรับการสร้าง SQL แบบไดนามิก แต่ (โดยไม่ผ่านการป้อนข้อมูลของผู้ใช้)
Chad Levy

10

เนื่องจากคุณดูเหมือนจะอยู่บนหลามฉันขอแนะนำให้คุณคัดลอกข้อความของคุณไปเป็นไพ ธ อนเช่น:

 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

ตัวอักษรสตริงหลายบรรทัดใน vb.net โดยใช้คลาส 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

สำหรับฉันนั่นเป็นสิ่งที่น่ารำคาญที่สุดเกี่ยวกับ 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

คำเตือน: ฉันรักหลาม มันเป็นสายหลายบรรทัดเป็นเพียงเหตุผลเดียว

แต่ฉันก็ทำ VB.Net ด้วยดังนั้นนี่คือทางลัดของฉันสำหรับสตริงที่มีความยาวที่อ่านได้มากขึ้น

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

1
คุณต้องการ _ ที่ท้ายบรรทัดสำหรับ "Line .. " แต่ละอันที่ดูน่าเกลียด
Kenji Noguchi

2
จริงๆแล้วคุณทำไม่ได้ VB รุ่นที่ใหม่กว่า (2010 และใหม่กว่าฉันคิดว่า?) ไม่จำเป็นต้องใช้ _ ในหลายกรณีรวมถึงตัวอย่างที่แสดงที่นี่
Darryl


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>

1

พร้อมใช้งานใน Visual Basic 14 เป็นส่วนหนึ่งของ Visual Studio 2015 https://msdn.microsoft.com/en-us/magazine/dn890368.aspx

แต่ยังไม่รองรับ R # ข่าวดีก็คือพวกเขาจะได้รับการสนับสนุนเร็ว ๆ นี้! โปรดลงคะแนนในYoutrackเพื่อแจ้ง JetBrains ที่คุณต้องการ


0

หากคุณต้องการ XML ตัวอักษรใน VB.Net ด้วยตัวแปรรหัสบรรทัดนี่คือวิธีที่คุณจะทำ:

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

โปรดทราบว่าทำไมคุณถึงพูดถึงตัวอักษร XML ที่นี่ไม่เห็น XML ที่กล่าวถึงในคำถามเดิม
Kmeixner

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

ฉันได้รับมรดกรหัส VB6 เดิมฉันต้องพอร์ตไปยัง VB.NET ซึ่งเต็มไปด้วยสิ่งเหล่านี้! :( ในกรณีนี้ฉันต้องการเสียสละประสิทธิภาพเพื่อให้อ่านง่าย
Zac

คุณไม่จำเป็นต้อง คุณสามารถต่อกันได้โดยไม่ต้องกำหนดตัวแปรอีกครั้งและจัดรูปแบบภายในบรรทัดเหล่านั้น
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)

มันจะแสดงสอง MessageBoxes เหมือนกันที่มี 2 บรรทัด


-9

ไม่ VB.NET ยังไม่มีคุณสมบัติดังกล่าว จะสามารถใช้ได้ในรอบถัดไปของ VB (Visual Basic 10) อย่างไรก็ตาม ( ลิงก์ )


คุณแน่ใจเหรอ ฉันรู้ว่าพวกเขาจะอนุญาตให้ใช้คำสั่งหลายบรรทัด แต่พวกเขาจะอนุญาตให้สายหลายสายเกินไป? ฉันหมายถึง "สวัสดี <newline> โลก"?
Mehrdad Afshari

1
การลบอักขระการต่อเนื่องบรรทัดและสตริงตัวอักษรหลายบรรทัดเป็นคุณสมบัติที่แตกต่างกัน
JaredPar

-16

ถ้ามันเหมือนกับ C # (ฉันไม่ได้ติดตั้ง VB.Net) คุณสามารถเติมสตริงด้วย @

foo = @"Multiline
String"

สิ่งนี้ยังมีประโยชน์สำหรับสิ่งต่าง ๆ เช่น @ "C: \ Windows \ System32 \" - โดยพื้นฐานแล้วมันจะปิดการหลบหนีและเปิด multiline

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.