Багаторядкові рядки у 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 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.

Деталі додаються до сховища 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.