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

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

a = """
multi
line
string
"""

или php

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

?

Конечно, что-то, что не является

"multi" & _
"line

Ответ 1

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

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

Ответ 2

У VB.Net нет такой функции, и в Visual Studio 2010 будет не. Функция, которая ссылается на jirwin, называется неявным продолжением строки. Это связано с удалением _ из многострочного оператора или выражения. Это устраняет необходимость прервать многострочную строку с помощью _, но в VB до сих пор не существует многострочного строкового литерала.

Пример для многострочной строки

Visual Studio 2008

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

Visual Studio 2010

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

Ответ 3

Я использовал этот вариант:

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

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

Ответ 4

Многоязычные строковые литералы представлены в 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 рамки)

Dim multiline = "multi
line
string"

Строки VB в основном теперь совпадают с строковыми строками С# - они не поддерживают escape-последовательности обратного слеша, такие как \n, и они позволяют использовать строки новой строки внутри строки, и вы избегаете символа цитаты с двойными кавычками ""

Ответ 5

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

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

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

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

Ответ 6

Ну, так как вы, кажется, на своем питоне, могу предложить вам скопировать текст в python, например:

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

то выполните a:

  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.

Ответ 7

Многострочные строковые литералы в 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

Ответ 8

Многострочные строки доступны с 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, подсчет ссылок или анализ кода.

Ответ 9

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

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

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

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

Ответ 10

Я выяснил, как использовать как <! [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

Ответ 11

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

 Dim a = My.Resources.Whatever_you_chose

Ответ 12

Отказ от ответственности: я люблю питон. Это многострочные строки - одна из причин.

Но я также делаю VB.Net, так что здесь моя короткая вырезка для более читаемых длинных строк.

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

Ответ 13

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

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

Ответ 14

в 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>

Ответ 15

Доступно в Visual Basic 14 как часть Visual Studio 2015 https://msdn.microsoft.com/en-us/magazine/dn890368.aspx

Но еще не поддерживается R #. Хорошая новость - скоро они будут поддержаны! Пожалуйста, проголосуйте Youtrack, чтобы уведомить JetBrains, в котором они вам также нужны.

Ответ 16

Если вам нужен XML-литерал в VB.Net с переменной строки, вот как вы это сделаете:

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

Ответ 17

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

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

Он отобразит два одинаковых MessageBoxes с двумя строками.

Ответ 18

Поскольку это проблема чтения, я использовал следующий код:

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

Ответ 19

Нет, VB.NET пока не имеет такой возможности. Он будет доступен на следующей итерации VB (визуальный базовый 10), однако (ссылка)

Ответ 20

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

foo = @"Multiline
String"

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