VB.NET'te çok satırlı dizeler


144

VB.NET'te Python gibi çok satırlı dizelerin olmasının bir yolu var mı

a = """
multi
line
string
"""

veya PHP?

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

Tabii ki olmayan bir şey

"multi" & _
"line

1
BTW: '"multi" & _ <newline> "line"' iki değil , bir dize değişmezidir. Yine de hala çirkin.
Joel Coehoorn


İki sentim: VS 2017'de VB.NET kodunuz derlenecek.
ᗩИ Ꭰ ЯƎᗩ

Yanıtlar:


223

Benzer bir etki elde etmek için XML Değişmezlerini kullanabilirsiniz :

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

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

Özel karakterleriniz varsa, bir CDATA bloğu kullanmanız gerektiğini unutmayın:

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

2015 GÜNCELLEME:

Çok satırlı dize değişmezleri Visual Basic 14'te ( Visual Studio 2015'te ) tanıtıldı . Yukarıdaki örnek şimdi şöyle yazılabilir:

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.

Ayrıntılar, Vlyn -in-VB-14 Github deposundaki Roslyn Yeni Dil Özellikleri'ne eklenir .


orada değişken değişimleri nasıl yapabilirsiniz? "a =" ve bazı & "," gibi
Christopher Mahan

1
@Christopher - Genellikle dizeleri sabit olarak belirteçleri koymak ve daha sonra değiştirmek daha okunabilir buluyorum. Yani s="... a=~someint~ ..."sonra s=s.Replace("~someint~', SomeInt).
Herb Caudill

Bu dinamik derleme ile çalışmıyor gibi görünüyor: CodeDomProvider.CreateProvider ("VisualBasic"). CompileAssemblyFromFile (<seçenekler>, <hile sözdizimi içinde <.vb dosyası>) ... Herhangi bir fikir? Bu sadece VS 2010 sözdizimsel şeker mi?
Chad

1
@romkyns Doğru değil, CDATA'nın nasıl kullanılacağını anladım ve hala <% =%> kullanarak gömebiliyorum Bkz .
Nelson

1
Müthiş! Kod girintisini yeni sözdizimi altındaki değişmez değere sokmadan nasıl korursunuz?
Panzercrisis

50

VB.Net böyle bir özelliği vardır ve olacaktır değil Visual Studio 2010 jirwin örtülü satır devam denir refering bu özelliği geliyor. _'Nin çok satırlı bir ifadeden veya ifadeden kaldırılmasıyla ilgilidir. Bu, _ ile çok satırlı bir dizeyi sonlandırma gereğini ortadan kaldırır, ancak VB'de hala çok satırlı dize değişmezi yoktur.

Çok satırlı dize örneği

Visual Studio 2008

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

Visual Studio 2010

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

Peki XML değişmezleri için nasıl çalışır? Ya mümkündür, ya da XML değişmez değerleri farklı bir teknik kullanıyor - ve farklı bir teknikse, çok satırlı dizelere genişletilebilen bir teknik.
mellamokb

1
@mellamokb XML değişmezleri .. daha iyi bir kelime olmaması için özeldir. Derleyici bunları anlar ve böylece birden fazla satırı dolaylı olarak yaymalarına izin verir. Çok satırlı dizeler için böyle bir destek eklenmedi. Böyle bir destek eklemek XML değişmezlerinden çok daha kolaydır, sadece bu sürümün çubuğuna uymadı.
JaredPar

38

Bu varyantı kullandım:

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

dizede <>


1
Harika bir teknik, ancak projenizin çalışması için bazı referanslar eklemek gerekebilir. Bkz. Msdn.microsoft.com/en-us/library/bb531455%28v=vs.90%29.aspx ve stackoverflow.com/a/28654126/3175562
Mike

30

Çok satırlı dizeler Visual Studio 2015'ten beri kullanılabilir.

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

Yararlılığı en üst düzeye çıkarmak için bunları dize enterpolasyonu ile birleştirebilirsiniz :

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

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

Not interpole dizeleri ile başlaması $ve özen gerekir ", {ve }içinde bulunan - dönüştürmek "", {{ya da }}sırasıyla.

Burada , yukarıdaki kod örneğinin enterpolasyonlu kısımlarının gerçek sözdizimi vurgulamasını görebilirsiniz :

resim açıklamasını buraya girin

Visual Studio düzenleyicisi tarafından tanınmasının da yeniden düzenleme ile çalışıp çalışmadığını merak ediyorsanız (örneğin, değişkenleri toplu olarak yeniden adlandırma), haklısınız, kod yeniden düzenleme bunlarla çalışır. IntelliSense, referans sayma veya kod analizini de desteklediklerinden bahsetmiyoruz.


20

Çok satırlı dize değişmezleri Visual Basic 14.0'da tanıtıldı - https://roslyn.codeplex.com/discussions/571884

Daha sonra şimdi VS2015 Önizlemesinde kullanabilirsiniz - http://www.visualstudio.com/en-us/downloads/visual-studio-2015-downloads-vs (daha eski bir hedefi hedeflerken bile VS2015'i kullanabileceğinizi unutmayın) .NET framework sürümü)

Dim multiline = "multi
line
string"

VB dizeleri temelde artık C # kelimesi kelimesine benziyor - \ n gibi ters eğik çizgi kaçış dizilerini desteklemiyorlar ve dizede yeni satırlara izin veriyorlar ve çift tırnak işareti ""


2
VB'ye çok satırlı dizeler eklediğiniz için Lucian'a teşekkür ederiz. Belki cevabınızı güncelleyebilirsiniz, çünkü VS 2015 artık RTM'dir. Ve belki de ilgili MSDN makalesini güncellemek için şirketinizde birisini dürtebilirsiniz .
miroxlav

14

bu benim için gerçekten yararlı bir makaleydi, ancak hiç kimse bazı değişkenler göndermek istediğinizde nasıl birleştirileceğini söylemedi , bu da zamanın% 99'unu yapmanız gerekiyor.

... <% =% değişken >> ...

Bunu nasıl yapacağınız aşağıda açıklanmıştır:

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


17
Bu durumda, birleştirme işleminden kaçınmak ve bunun yerine SQL enjeksiyon saldırılarına karşı sertleşmede daha iyi oldukları için SQL parametrelerini kullanmak istersiniz. Bu dinamik SQL üretimi için yararlı olduğunu görebilirsiniz (kullanıcı girişi geçmeden).
Chad Levy

10

Python'unuzda gibi göründüğünüz için, metninizi aşağıdaki gibi python'a kopyalamanızı önerebilir miyim:

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

sonra şunları yapın:

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

veya

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

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

en azından bunu kopyalayıp VB kodunuza koyabilirsiniz. Yapıştırma tamponunuzda ne varsa bunun için bir kısayol tuşunu (en hızlı: Autohotkey ) bağlarsanız bonus puanlar . Aynı fikir bir SQL formatlayıcı için de işe yarar.


8

XElement sınıfını kullanarak vb.net'te çok satırlı dize değişmezleri.

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

Bana göre bu, dil olarak VB ile ilgili en sinir bozucu şey. Cidden, ben bir kez dize bir dosyaya yazdı ve satırları boyunca bir şey kodu yazdı:

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

sadece bu yüzden gerekiyorsa doğrudan SQL sunucusunda sorgu test.

Şu anki yöntemim, SQL Server'da saklı bir yordamı kullanmak ve sadece sorguya vb.


5

Endişelenmeden kod yazmanıza olanak tanıyan değişkenler için hem <! [CDATA [ile birlikte <% = 'nin nasıl kullanılacağını anladım.

Temel olarak VATA değişkeninden önce CDATA etiketlerini sonlandırmanız ve ardından CDATA'nın VB kodunu yakalamaması için yeniden eklemeniz gerekir. Birden fazla CDATA bloğunuz olacağı için kod bloğunun tamamını bir etikete sarmanız gerekir.

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

3

Dizeyi bir kaynak dosyasına (örneğin, "Projem" / Kaynaklar) koyabilir ve eklemelisiniz?

 Dim a = My.Resources.Whatever_you_chose

3

Yasal Uyarı: Python'u seviyorum. Çok satırlı dizeleri sadece bir nedendir.

Ama ben de VB.Net yapıyorum, işte daha okunabilir uzun teller için kısayol.

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

1
Çirkin görünen her "Satır .." için satırın sonunda _ gerekir.
Kenji Noguchi

2
Aslında bilmiyorsun. VB'nin daha sonraki sürümleri (2010 ve sonrası sanırım?) Burada gösterilen örnek de dahil olmak üzere birçok durumda _ gerektirmez.
Darryl

2

bunun için XML kullanabilirsiniz

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

1

Visual Studio 2010'da (VB NET) aşağıdakileri deniyorum ve iyi çalışıyor

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'te bir satır kodu değişkeni olan bir XML değişmezine ihtiyacınız varsa, bunu şu şekilde yapabilirsiniz:

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

Burada neden bir XML değişmezinden bahsettiğinizden emin olun, orijinal soruda belirtilen XML'yi görmeyin.
Kmeixner

0

System.Text.StringBuilderSınıfı şu şekilde de kullanabilirsiniz :

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

Sonra kullanarak çok satırlı dize alırsınız:

sValue.ToString()

-1

Bu bir okunabilirlik sorunu olduğundan, aşağıdaki kodu kullandım:

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

1
Bu kötü. 4 dize örneği oluşturdunuz
TS

Bunlarla dolu VB.NET için bağlantı noktası var eski bir VB6 kodu miras! :( Bu durumda okunabilirliği korumak için performansı feda etmeyi tercih ediyorum.
Zac

Yapmanıza gerek yok. Bir değişkeni yeniden atamadan her zaman birleştirme yapabilir ve bu satırlar içinde biçimlendirebilirsiniz
TS

Benim durumumda doğru bir sözdizimine geçmek için geçerli değil çünkü tam bir kod demetini değiştirmeliyim ve projede zaman kalmadı.
Zac

-1

vbCrLfVeya tuşunu kullanın vbNewLine. MessageBoxes ve test ettiğim diğer birçok kontrol ile çalışır.

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

2 satırlı iki özdeş MessageBoxes gösterecektir.


-9

Hayır, VB.NET'in henüz böyle bir özelliği yok. Ancak VB'nin bir sonraki yinelemesinde mevcut olacak (visual basic 10) ( link )


Emin misin? Çok satırlı ifadelere izin vereceklerini biliyorum, ama çok satırlı dizelere de izin verecekler mi ? "Merhaba <newline> dünyası" demek?
Mehrdad Afshari

1
Satır devam karakterinin ve çok satırlı değişmez dizelerin kaldırılması farklı özelliklerdir.
JaredPar

-16

C # gibi (VB.Net yüklü değilse) @ ile bir dize önek ekleyebilirsiniz

foo = @"Multiline
String"

bu da @ "C: \ Windows \ System32 \" gibi şeyler için kullanışlıdır - aslında kaçmayı kapatır ve çok satırlı açar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.