Один оператор в нескольких строках в VB.NET без символа подчеркивания - PullRequest
35 голосов
/ 20 января 2009

Есть ли способ иметь оператор в нескольких строках без символа подчеркивания?

Это действительно раздражает в многострочных строках, таких как операторы SQL, и особенно LINQ запросов.

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

Примеры моего ежедневного личного ада.

dim results = from a in articles _
              where a.articleID = 4 _ ' articleID     - Nope, can't do this
              select a.articleName


dim createArticle as string = _
    "Create table article " & _
    "    (articleID int " & _
    "    ,articleName varchar(50) " & _
    "    )"

Ответы [ 8 ]

39 голосов
/ 20 января 2009

Нет, вы должны использовать подчеркивание, но я полагаю, что VB.NET 10 допускает несколько строк без подчеркивания, требуя только, если он не может определить, где должен быть конец.

5 голосов
/ 01 ноября 2010

Для большинства многострочных строк, использующих элемент XML с внутренним блоком CDATA, легче избежать экранирования чего-либо для простых необработанных строковых данных.

Dim s as string = <s><![CDATA[Line 1
line 2
line 3]]></s>.Value

Обратите внимание, что я видел, как многие люди указывали один и тот же формат, но без оберточного тега "" (только блок CDATA), но в Visual Studio автоматическое форматирование швов для изменения начальных пробелов каждой строки. Я думаю, что это связано со структурой наследования объектов позади объектов Linq «X». CDATA - это не «Контейнер», внешний блок - это XElement, который наследуется от XContainer.

4 голосов
/ 20 января 2009

Я скажу нет.

Но единственным доказательством, которое у меня есть, является личный опыт и тот факт, что в документации по продолжению линии больше ничего нет.

http://msdn.microsoft.com/en-us/library/aa711641(VS.71).aspx

2 голосов
/ 19 января 2016

Начиная с VB.NET 10, неявное продолжение строки поддерживается для ряда элементов синтаксиса (см. Операции в Visual Basic: продолжение оператора по нескольким строкам ). Оператор конкатенации (&) находится в списке элементов синтаксиса, которые поддерживают неявное продолжение строки. Также поддерживаются чередующиеся комментарии, поэтому ваш второй пример можно переписать так:

dim createArticle as string = 
    "Create table article " &
    "    (articleID int " &           ' Comment for articleID
    "    ,articleName varchar(50) " & ' Comment for articleName
    "    )"

Неявное продолжение строки также работает для операторов запросов, с некоторыми ограничениями:

Операторы запросов до и после ( Совокупность , Отличительные , От , Группировка по , Присоединение к группе, Регистрация , Пусть , Порядок по , Выбор , Пропуск , Пропуск при, Взять , Взять пока , Где , В , В , Вкл , по возрастанию и по убыванию ). Вы не можете разбить строку между ключевыми словами операторов запросов, которые состоят из нескольких ключевых слов ( Упорядочить по , Групповое объединение , Take While и Пропустить Пока ).

Опять же, допускаются чередующиеся комментарии, поэтому ваш первый пример можно переписать так:

dim results = from a in articles
              where a.articleID = 4  ' articleID - now perfectly legal
              select a.articleName
1 голос
/ 06 июня 2014

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

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

Вот соответствующий фрагмент:

Я понял, как использовать оба <! [CDATA [вместе с <% = для переменных, что позволяет вам без проблем кодировать. </p>

По сути, вам нужно завершить теги CDATA перед переменной VB, а затем повторно добавить ее после, чтобы CDATA не захватывал код VB. Вам нужно обернуть весь блок кода в тег, потому что у вас будет несколько блоков CDATA.

Dim script As String = <code><![CDATA[
  <script type="text/javascript">
    var URL = ']]><%= domain %><![CDATA[/mypage.html';
  </script>]]>
</code>.value
1 голос
/ 03 сентября 2012

Я знаю, что на это есть принятый ответ, но это лучшая статья, которую я нашел при поиске этого вопроса, и сейчас она очень устарела. Я провел еще немного исследований, и эта статья MSDN содержит список элементов синтаксиса, которые неявно продолжают оператор следующей строки кода для VB.Net 2010.

1 голос
/ 20 января 2009

Нет, подчеркивание - единственный символ продолжения. Лично я предпочитаю, чтобы случайное использование символа продолжения было вынуждено использовать его всегда, как в C #, но кроме проблемы с комментариями (которая, я бы согласился, иногда раздражает), проблема не выстраивается. *

Для VS2008, во всяком случае, просто выберите вторую и последующие строки, несколько раз нажмите клавишу табуляции, и она переместится на весь лот.

Если это заходит слишком далеко, вы можете удалить лишний пробел символ за раз. Это немного неудобно, но после сохранения оно остается на месте.

В тех редких случаях, когда этого недостаточно, я иногда использую следующую технику, чтобы выстроить все в ряд:

dim results as String = ""
results += "from a in articles "
results += "where a.articleID = 4 " 'and now you can add comments
results += "select a.articleName"

Это не идеально, и я знаю, что те, кто предпочитает C #, будут брезговать, но это так. Это выбор стиля, но я все еще предпочитаю бесконечные точки с запятой.

Теперь я просто жду, когда кто-нибудь скажет мне, что я должен был использовать StringBuilder; -)

0 голосов
/ 14 июля 2010

Вы можете использовать литералы XML, чтобы сделать это:

Dim s = <sql>
  Create table article
  (articleID int  -- sql comment
  ,articleName varchar(50)  <comment text="here's an xml comment" />
  )
</sql>.Value

предупреждение: применяются текстовые правила XML, например & amp; для амперсанда & lt; для <и т. д. </p>

Dim alertText = "Hello World"
Dim js = <script>
          $(document).ready(function() {
           alert('<%= alertText %>');
          });
         </script>.ToString  'instead of .Value includes <script> tag

примечание: вышеупомянутое проблематично, если оно включает символы, которые необходимо экранировать. Лучше использовать "<script>"+js.Value+"</script>"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...