Есть ли способ иметь многострочные строки в VB.NET, как Python
a = """
multi
line
string
"""
или PHP?
$a = <<<END
multi
line
string
END;
Конечно то, что не
"multi" & _
"line
Есть ли способ иметь многострочные строки в VB.NET, как Python
a = """
multi
line
string
"""
или PHP?
$a = <<<END
multi
line
string
END;
Конечно то, что не
"multi" & _
"line
Ответы:
Вы можете использовать XML Literals для достижения аналогичного эффекта:
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
Многострочные строковые литералы были введены в 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.
Подробности добавляются в репозиторий Roslyn New-Language-Features-in-VB-14 Github.
s="... a=~someint~ ..."
и тогда s=s.Replace("~someint~', SomeInt)
.
В VB.Net такой функции нет, и она не появится в Visual Studio 2010. Функция, которую упоминает jirwin, называется неявным продолжением строки. Это связано с удалением _ из многострочного оператора или выражения. Это устраняет необходимость завершать многострочную строку символом _, но в VB все еще нет многострочного строкового литерала.
Пример для многострочной строки
Visual Studio 2008
Dim x = "line1" & vbCrlf & _
"line2"
Visual Studio 2010
Dim x = "line1" & vbCrlf &
"line2"
Я использовал этот вариант:
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()
это позволяет <> в строке
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 с рефакторингом (например, массовое переименование переменных), то вы правы, рефакторинг кода работает с ними. Не говоря уже о том, что они также поддерживают IntelliSense, подсчет ссылок или анализ кода.
Многострочные строковые литералы представлены в Visual Basic 14.0 - https://roslyn.codeplex.com/discussions/571884.
Вы можете использовать его в предварительном просмотре VS2015, прямо сейчас - http://www.visualstudio.com/en-us/downloads/visual-studio-2015-downloads-vs (обратите внимание, что вы все еще можете использовать VS2015 даже при нацеливании на более старые версия .NET Framework)
Dim multiline = "multi
line
string"
Строки VB теперь в основном совпадают со стенографическими строками C # - они не поддерживают escape-последовательности с обратной косой чертой, такие как \ n, и разрешают переводы строк внутри строки, и вы экранируете символ кавычки двойными кавычками ""
это была действительно полезная статья для меня, но никто не упомянул, как объединять, если вы хотите отправить некоторые переменные, что вам и нужно делать в 99% случаев.
... <% = переменная %> ...
Вот как вы это делаете:
<SQL>
SELECT * FROM MyTable WHERE FirstName='<%= EnteredName %>'
</SQL>.Value
Что ж, раз уж вы, кажется, знакомы с вашим питоном, я могу предложить вам скопировать ваш текст в python, например:
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.
Многострочные строковые литералы в 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
Для меня это самая раздражающая вещь о VB как о языке. Серьезно, я однажды написал строку в файле и написал что-то вроде кода:
Dim s as String = file_get_contents("filename.txt")
просто, чтобы я мог проверить запрос непосредственно на сервере SQL, если мне нужно.
Мой текущий метод состоит в том, чтобы использовать хранимую процедуру на SQL Server и просто вызывать ее, чтобы я мог передать параметры в запрос и т. Д.
Я выяснил, как использовать оба <! [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
Отказ от ответственности: я люблю питона. Это многострочные строки только одна причина.
Но я также делаю VB.Net, так что вот мой краткий путь для более удобочитаемых длинных строк.
Dim lines As String() = {
"Line 1",
"Line 2",
"Line 3"
}
Dim s As String = Join(lines, vbCrLf)
Вы можете использовать XML для этого, как
dim vrstr as string = <s>
some words
some words
some
words
</s>
в 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>
Доступно в Visual Basic 14 как часть Visual Studio 2015 https://msdn.microsoft.com/en-us/magazine/dn890368.aspx
Но пока не поддерживается R #. Хорошей новостью является то, что они будут поддерживаться в ближайшее время! Пожалуйста, проголосуйте за Youtrack, чтобы уведомить JetBrains, что они вам также нужны.
Если вам нужен XML-литерал в VB.Net с переменной строкового кода, вот как вы это сделаете:
<Tag><%= New XCData(T.Property) %></Tag>
Поскольку это проблема читабельности, я использовал следующий код:
MySql = ""
MySql = MySql & "SELECT myTable.id"
MySql = MySql & " FROM myTable"
MySql = MySql & " WHERE myTable.id_equipment = " & lblId.Text
Используйте vbCrLf
или vbNewLine
. Он работает с MessageBoxes и многими другими элементами управления, которые я тестировал.
Dim str As String
str = "First line" & vbCrLf & "Second line"
MsgBox(str)
str = "First line" & vbNewLine & "Second line"
MsgBox(str)
Он покажет два идентичных MessageBox с двумя строками.
Нет, в VB.NET такой функции еще нет. Это будет доступно в следующей итерации VB (Visual Basic 10), однако ( ссылка )
если это похоже на C # (у меня не установлен VB.Net), вы можете поставить строку с префиксом @
foo = @"Multiline
String"
это также полезно для таких вещей, как @ "C: \ Windows \ System32 \" - оно по существу отключает экранирование и включает многострочное.