Многострочные строки в VB.NET

144

Есть ли способ иметь многострочные строки в VB.NET, как Python

a = """
multi
line
string
"""

или PHP?

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

Конечно то, что не

"multi" & _
"line
pistacchio
источник
1
Кстати: '' multi '& _ <newline> "line"' - это один строковый литерал, а не два. Это все еще уродливо, хотя.
Джоэл Коухорн
Мои два цента: в VS 2017 ваш код VB.NET будет скомпилирован.
ᗩИ Ꭰ ЯƎᗩ

Ответы:

223

Вы можете использовать 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

ОБНОВЛЕНИЕ 2015:

Многострочные строковые литералы были введены в Visual Basic 14Visual 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.

Винченцо Алькамо
источник
как вы можете сделать замену переменных там? как "a =" & someint & ","
Кристофер Махан
1
@Christopher - мне обычно удобнее помещать токены в строковую константу, а затем заменять их. Так s="... a=~someint~ ..."и тогда s=s.Replace("~someint~', SomeInt).
Херб Каудилл
Похоже, это не работает с динамической компиляцией: CodeDomProvider.CreateProvider ("VisualBasic"). CompileAssemblyFromFile (<параметры>, <.vb файл с указанным выше синтаксисом трюка в нем>) ... Есть идеи? Это только синтаксический сахар VS 2010?
Чад
1
@romkyns Не правда, я выяснил, как использовать CDATA и все еще иметь возможность вставлять, используя <% =%>. Смотрите здесь
Нельсон,
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"
JaredPar
источник
Так как же это работает для литералов 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()

это позволяет <> в строке

ozzy432836
источник
1
Отличная техника, но, возможно, придется добавить несколько ссылок на ваш проект, чтобы он работал. См .: msdn.microsoft.com/en-us/library/bb531455%28v=vs.90%29.aspx и stackoverflow.com/a/28654126/3175562
Майк
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 с рефакторингом (например, массовое переименование переменных), то вы правы, рефакторинг кода работает с ними. Не говоря уже о том, что они также поддерживают IntelliSense, подсчет ссылок или анализ кода.

miroxlav
источник
20

Многострочные строковые литералы представлены в 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, и разрешают переводы строк внутри строки, и вы экранируете символ кавычки двойными кавычками ""

Лучиан Висчик
источник
2
Спасибо Lucian за добавление многострочных строк в VB. Может быть, вы можете обновить свой ответ, потому что VS 2015 сейчас RTM. И, может быть, вы также можете ткнуть кого-нибудь в вашей компании, чтобы обновить соответствующую статью MSDN .
miroxlav
14

это была действительно полезная статья для меня, но никто не упомянул, как объединять, если вы хотите отправить некоторые переменные, что вам и нужно делать в 99% случаев.

... <% = переменная %> ...

Вот как вы это делаете:

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

Destructerator
источник
17
В этом случае вы хотите избежать конкатенации и вместо этого использовать параметры SQL, поскольку они лучше защищают от атак с использованием SQL-инъекций. Я вижу, что это полезно для динамического генерирования SQL, хотя (без передачи пользовательского ввода).
Чад Леви
10

Что ж, раз уж вы, кажется, знакомы с вашим питоном, я могу предложить вам скопировать ваш текст в 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.

RichardJohnn
источник
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
Windchaser
источник
7

Для меня это самая раздражающая вещь о VB как о языке. Серьезно, я однажды написал строку в файле и написал что-то вроде кода:

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

просто, чтобы я мог проверить запрос непосредственно на сервере SQL, если мне нужно.

Мой текущий метод состоит в том, чтобы использовать хранимую процедуру на SQL Server и просто вызывать ее, чтобы я мог передать параметры в запрос и т. Д.

Osiname
источник
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

Вы можете (должны?) Поместить строку в файл ресурсов (например, «Мой проект» / Ресурсы), а затем получить ее с помощью

 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
Вам нужно _ в конце строки для каждой "строки ..", которая выглядит ужасно.
Кендзи Ногучи,
2
На самом деле вы не делаете. Более поздние версии VB (2010 и более поздние, я думаю?) Не требуют _ во многих случаях, включая пример, показанный здесь.
Дэррил
2

Вы можете использовать XML для этого, как

dim vrstr as string = <s>
    some words
    some words
    some
    words
</s>
Джек Гаджанан
источник
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>
user1166557
источник
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
Zac
источник
1
Это плохо. Вы только что создали 4 экземпляра строки
TS
Я унаследовал устаревший код VB6, который я должен перенести на VB.NET, который полон этих! :( В этом случае я предпочитаю жертвовать производительностью, чтобы сохранить читабельность.
Зак
Вам не нужно Вы всегда можете объединить, не переназначая переменную, и отформатировать в этих строках
TS
В моем случае неприменимо переключение на правильный синтаксис, так как я должен изменить полный пакет кода, и на проекте не осталось времени.
Зак
-1

Используйте vbCrLfили vbNewLine. Он работает с MessageBoxes и многими другими элементами управления, которые я тестировал.

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

Он покажет два идентичных MessageBox с двумя строками.

LuizLoyola
источник
-9

Нет, в VB.NET такой функции еще нет. Это будет доступно в следующей итерации VB (Visual Basic 10), однако ( ссылка )

Джейсон Ирвин
источник
Вы уверены? Я знаю, что они позволят многострочные операторы, но они также позволят многострочные строки ? Я имею в виду "привет <newline> мир"?
Мехрдад Афшари
1
Удаление символа продолжения строки и многострочных буквенных строк - это разные особенности.
JaredPar
-16

если это похоже на C # (у меня не установлен VB.Net), вы можете поставить строку с префиксом @

foo = @"Multiline
String"

это также полезно для таких вещей, как @ "C: \ Windows \ System32 \" - оно по существу отключает экранирование и включает многострочное.

Энди Хохорст
источник