Czy istnieje sposób na posiadanie ciągów wielowierszowych w VB.NET, takich jak Python
a = """
multi
line
string
"""
czy PHP?
$a = <<<END
multi
line
string
END;
Oczywiście coś, co nie jest
"multi" & _
"line
Czy istnieje sposób na posiadanie ciągów wielowierszowych w VB.NET, takich jak Python
a = """
multi
line
string
"""
czy PHP?
$a = <<<END
multi
line
string
END;
Oczywiście coś, co nie jest
"multi" & _
"line
Odpowiedzi:
Możesz użyć literałów XML, aby osiągnąć podobny efekt:
Imports System.XML
Imports System.XML.Linq
Imports System.Core
Dim s As String = <a>Hello
World</a>.Value
Pamiętaj, że jeśli masz znaki specjalne, powinieneś użyć bloku CDATA:
Dim s As String = <![CDATA[Hello
World & Space]]>.Value
Wieloliniowe literały ciągów zostały wprowadzone w języku Visual Basic 14 (w programie Visual Studio 2015 ). Powyższy przykład można teraz zapisać jako:
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.
Szczegóły są dodawane do repozytorium Roslyn New-Language-Features-in-VB-14 Github.
s="... a=~someint~ ..."
i wtedy s=s.Replace("~someint~', SomeInt)
.
VB.Net ma taką funkcję, a to będzie nie przychodzić w Visual Studio 2010. Cechą jirwin jest refering nazywany jest niejawna linia kontynuacji. Ma to związek z usunięciem znaku _ z instrukcji lub wyrażenia wielowierszowego. Eliminuje to potrzebę kończenia ciągu wielowierszowego znakiem _, ale nadal nie ma literału ciągu wielowierszowego w VB.
Przykład ciągu wielowierszowego
Visual Studio 2008
Dim x = "line1" & vbCrlf & _
"line2"
Visual Studio 2010
Dim x = "line1" & vbCrlf &
"line2"
Użyłem tego wariantu:
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()
dopuszcza <> w ciągu
Dim sql As String = "
SELECT ID, Description
FROM inventory
ORDER BY DateAdded
"
Możesz je łączyć z interpolacją ciągów, aby zmaksymalizować użyteczność:
Dim primaryKey As String = "ID"
Dim inventoryTable As String = "inventory"
Dim sql As String = $"
SELECT {primaryKey}, Description
FROM {inventoryTable}
ORDER BY DateAdded
"
Zauważ, że interpolowane ciągi rozpoczynają się $
i trzeba się zająć "
, {
a }
zawarte w środku - przekształcenie ich ""
, {{
albo }}
odpowiednio.
Tutaj możesz zobaczyć faktyczne podświetlanie składni interpolowanych części powyższego przykładu kodu:
Jeśli zastanawiasz się, czy ich rozpoznawanie przez edytor Visual Studio działa również z refaktoryzacją (np. Masową zmianą nazw zmiennych), to masz rację, refaktoryzacja kodu działa z nimi. Nie wspominając o tym, że obsługują również technologię IntelliSense, zliczanie odwołań lub analizę kodu.
Wielowierszowe literały ciągów są wprowadzane w Visual Basic 14.0 - https://roslyn.codeplex.com/discussions/571884
Możesz użyć tego w wersji zapoznawczej VS2015, która jest już dostępna - http://www.visualstudio.com/en-us/downloads/visual-studio-2015-downloads-vs (pamiętaj, że nadal możesz używać VS2015, nawet jeśli celujesz w starszą wersja platformy .NET)
Dim multiline = "multi
line
string"
Ciągi VB są teraz w zasadzie takie same jak ciągi C # dosłowne - nie obsługują sekwencji ucieczki z ukośnikiem odwrotnym, takich jak \ n, i zezwalają na znaki nowej linii w ciągu, a symbol cudzysłowu jest zastępowany podwójnymi cudzysłowami ""
był to dla mnie bardzo pomocny artykuł, ale nikt nie wspomniał o tym, jak łączyć w przypadku, gdy chcesz wysłać jakieś zmienne, co musisz robić w 99% przypadków.
... <% = zmienna %> ...
Oto jak to robisz:
<SQL>
SELECT * FROM MyTable WHERE FirstName='<%= EnteredName %>'
</SQL>.Value
Cóż, skoro wydajesz się być na swoim Pythonie, mogę zasugerować skopiowanie tekstu do Pythona, na przykład:
s="""this is gonna
last quite a
few lines"""
następnie wykonaj:
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")
lub
print ' & _ \n'.join(map(lambda s: '"%s"' % s, s.split('\n')))
# "this is gonna" & _
# "last quite a" & _
# "few lines"
wtedy przynajmniej możesz to skopiować i umieścić w swoim kodzie VB. Dodatkowe punkty, jeśli przypiszesz skrót klawiszowy (najszybszy do uzyskania za pomocą: Autohotkey ), aby zrobić to dla wszystkiego, co znajduje się w twoim buforze wklejania. Ten sam pomysł działa dobrze w przypadku programu formatującego SQL.
Wieloliniowe literały ciągów w vb.net przy użyciu klasy 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
To jest dla mnie najbardziej irytujące w VB jako języku. Poważnie, kiedyś napisałem ciąg w pliku i napisałem kod w następujący sposób:
Dim s as String = file_get_contents("filename.txt")
tylko po to, aby móc przetestować zapytanie bezpośrednio na serwerze SQL, jeśli zajdzie taka potrzeba.
Moja obecna metoda polega na użyciu procedury składowanej na serwerze SQL i po prostu wywołanie tego, aby móc przekazać parametry do zapytania itp.
Dowiedziałem się, jak używać obu <! [CDATA [wraz z <% = dla zmiennych, co pozwala ci kodować bez obaw.
Zasadniczo musisz zakończyć tagi CDATA przed zmienną VB, a następnie ponownie dodać ją po, aby CDATA nie przechwytywał kodu VB. Musisz owinąć cały blok kodu w znacznik, ponieważ będziesz mieć wiele bloków CDATA.
Dim script As String = <code><![CDATA[
<script type="text/javascript">
var URL = ']]><%= domain %><![CDATA[/mypage.html';
</script>]]>
</code>.value
Zastrzeżenie: uwielbiam Pythona. Wieloliniowe ciągi to tylko jeden powód.
Ale robię też VB.Net, więc oto mój skrót do bardziej czytelnych długich ciągów.
Dim lines As String() = {
"Line 1",
"Line 2",
"Line 3"
}
Dim s As String = Join(lines, vbCrLf)
możesz użyć do tego XML
dim vrstr as string = <s>
some words
some words
some
words
</s>
w Visual Studio 2010 (VB NET) próbuję wykonać następujące czynności i działa dobrze
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>
Dostępne w Visual Basic 14 jako część Visual Studio 2015 https://msdn.microsoft.com/en-us/magazine/dn890368.aspx
Ale nie jest jeszcze obsługiwany przez R #. Dobra wiadomość jest taka, że wkrótce otrzymają wsparcie! Zagłosuj na Youtrack, aby powiadomić JetBrains, że ich również potrzebujesz.
Jeśli potrzebujesz literału XML w VB.Net ze zmienną kodu linii, możesz to zrobić w następujący sposób:
<Tag><%= New XCData(T.Property) %></Tag>
Ponieważ jest to problem z czytelnością, użyłem następującego kodu:
MySql = ""
MySql = MySql & "SELECT myTable.id"
MySql = MySql & " FROM myTable"
MySql = MySql & " WHERE myTable.id_equipment = " & lblId.Text
Użyj vbCrLf
lub vbNewLine
. Działa z MessageBoxami i wieloma innymi kontrolkami, które testowałem.
Dim str As String
str = "First line" & vbCrLf & "Second line"
MsgBox(str)
str = "First line" & vbNewLine & "Second line"
MsgBox(str)
Pokaże dwa identyczne MessageBoxes z 2 liniami.
Nie, VB.NET nie ma jeszcze takiej funkcji. Będzie dostępny w następnej iteracji VB (Visual Basic 10), jednak ( link )
jeśli jest jak C # (nie mam zainstalowanego VB.Net), możesz poprzedzić ciąg znakiem @
foo = @"Multiline
String"
jest to również przydatne w przypadku takich rzeczy jak @ "C: \ Windows \ System32 \" - zasadniczo wyłącza ucieczkę i włącza multilinię.