Багаторядкові рядки у VB.NET


144

Чи є спосіб мати багаторядкові рядки в VB.NET, як Python

a = """
multi
line
string
"""

чи PHP?

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

Звичайно щось, що ні

"multi" & _
"line

1
BTW: '"multi" & _ <newline> "рядок"' - це один рядковий буквальний, а не два. Це все ще негарно.
— Joel Coehoorn


Мої два центи: у VS 2017 ваш код VB.NET буде складений.
— ᗩІ Ꭰ ЯƎᗩ

Відповіді:


222

Ви можете використовувати 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 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.

Деталі додаються до сховища Github Roslyn New-Language-Features-in-VB-14 .


як можна робити замінники змінних там? як "a =" & someint & ","
— Крістофер Махан

1
@Christopher - Я зазвичай вважаю більш читальним розміщувати лексеми в постійній константі, а потім замінювати їх. Так s="... a=~someint~ ..."і тоді s=s.Replace("~someint~', SomeInt).
— Herb Caudill

Схоже, це не працює з динамічною компіляцією: 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"

То як же це працює для 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()

це дозволяє <> в рядку


1
Чудова техніка, але, можливо, доведеться додати кілька посилань на ваш проект, щоб він працював. Див: msdn.microsoft.com/en-us/library/bb531455%28v=vs.90%29.aspx і stackoverflow.com/a/28654126/3175562
— Mike

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, підрахунок посилань або аналіз коду.


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)

Dim multiline = "multi
line
string"

Рядки VB в основному зараз такі ж, як C # дослідні рядки - вони не підтримують зворотні похилі послідовності на зразок \ n, і вони дозволяють створювати нові рядки в рядку, і ви уникаєте символу цитати з подвійними лапками ""


2
Дякую Лучан за додавання багаторядкових рядків у VB. Можливо, ви можете оновити свою відповідь, оскільки VS 2015 зараз RTM. І, можливо, ви також можете натиснути когось у вашій компанії, щоб оновити відповідні статті MSDN .
— miroxlav

14

це була для мене справді корисна стаття, але ніхто не згадав, як об'єднатись у випадку, якщо ви хочете надіслати деякі змінні, для чого вам потрібно займатися 99% часу.

... <% = змінна %> ...

Ось як це зробити:

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


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. Бонусні бали, якщо ви зв'язали гарячу клавішу (найшвидше її отримати: Автоматична клавіша ), щоб зробити це для того, що є в буфері вставки. Ця ж ідея добре працює для форматера SQL.


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

7

Мені це найбільше дратує VB як мова. Серйозно, я одного разу написав рядок у файл і щось написав у рядку:

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

просто так я міг би перевірити запит безпосередньо на SQL сервері, якщо мені це потрібно.

Мій поточний метод - використовувати збережену процедуру на SQL сервері та просто зателефонувати, щоб я міг передати параметри запиту тощо


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, а згодом я думаю, що?) Не потребують _ у багатьох випадках, включаючи наведений тут приклад.
— Дарріл


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>


0

Якщо вам потрібен XML-літерал у VB.Net зі змінною кодового рядка, це робиться так:

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

Зверніть увагу, чому ви тут згадуєте XML-літерал, XML не згадується в первинному запитанні.
— Кмейкснер

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

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)

На ній будуть показані два однакові повідомленнябокси з 2 рядками.


-9

Ні, VB.NET ще не має такої функції. Він буде доступний у наступній ітерації VB (візуальний базовий 10), однак ( посилання )


Ти впевнений? Я знаю, що вони дозволять багаторядкові висловлювання, але чи дозволять вони і рядкові рядки ? Я маю на увазі "привіт <newline> світ"?
— Мехрдад Афшарі

1
Видалення символу продовження рядків та багаторядкових буквальних рядків - це різні особливості.
— JaredPar

-16

якщо це як C # (у мене не встановлено VB.Net), ви можете встановити рядок з @

foo = @"Multiline
String"

це також корисно для таких речей, як @ "C: \ Windows \ System32 \" - воно по суті вимикає втечу і вмикається на багаторядковий.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.