Chaînes multilignes dans VB.NET

144

Existe-t-il un moyen d'avoir des chaînes multilignes dans VB.NET comme Python

a = """
multi
line
string
"""

ou PHP?

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

Bien sûr quelque chose qui n'est pas

"multi" & _
"line
pistache
la source
1
BTW: '"multi" & _ <newline> "line"' est une chaîne littérale, pas deux. C'est toujours moche, cependant.
Joel Coehoorn
Mes deux cents: dans VS 2017, votre code VB.NET serait compilé.
ᗩИ Ꭰ ЯƎᗩ

Réponses:

223

Vous pouvez utiliser des littéraux XML pour obtenir un effet similaire:

Imports System.XML
Imports System.XML.Linq
Imports System.Core

Dim s As String = <a>Hello
World</a>.Value

N'oubliez pas que si vous avez des caractères spéciaux, vous devez utiliser un bloc CDATA:

Dim s As String = <![CDATA[Hello
World & Space]]>.Value

MISE À JOUR 2015:

Les littéraux de chaîne multiligne ont été introduits dans Visual Basic 14 (dans Visual Studio 2015 ). L'exemple ci-dessus peut maintenant être écrit comme suit:

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.

Des détails sont ajoutés au référentiel Github Roslyn New-Language-Features-in-VB-14 .

Vincenzo Alcamo
la source
comment pouvez-vous faire des remplacements de variables là-dedans? comme "a =" & someint & ","
Christopher Mahan
1
@Christopher - Je trouve généralement plus lisible de mettre des jetons dans la constante de chaîne, puis de les remplacer. Untel s="... a=~someint~ ..."et puis s=s.Replace("~someint~', SomeInt).
Herb Caudill
Cela ne semble pas fonctionner avec la compilation dynamique: CodeDomProvider.CreateProvider ("VisualBasic"). CompileAssemblyFromFile (<options>, <fichier .vb avec la syntaxe d'astuce ci-dessus>) ... Des idées? Est-ce juste du sucre syntaxique VS 2010?
Chad
1
@romkyns Ce n'est pas vrai, j'ai compris comment utiliser CDATA et être toujours en mesure de l'intégrer en utilisant <% =%> Voir ici
Nelson
1
Impressionnant! Comment maintenir l'indentation du code sans l'introduire dans le littéral sous la nouvelle syntaxe?
Panzercrisis
50

VB.Net n'a pas une telle fonctionnalité et elle ne sera pas disponible dans Visual Studio 2010. La fonctionnalité que jirwin fait référence est appelée continuation de ligne implicite. Il s'agit de supprimer le _ d'une instruction ou d'une expression multiligne. Cela supprime le besoin de terminer une chaîne multiligne avec _ mais il n'y a toujours pas de littéral de chaîne multiligne dans VB.

Exemple de chaîne multiligne

Visual Studio 2008

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

Visual Studio 2010

Dim x = "line1" & vbCrlf & 
        "line2"
JaredPar
la source
Alors, comment ça marche pour les littéraux XML? Soit c'est possible, soit les littéraux XML utilisent une technique différente - et s'il s'agit d'une technique différente, celle qui pourrait être étendue aux chaînes multilignes.
mellamokb
1
Les littéraux XML @mellamokb sont .. spéciaux faute d'un meilleur mot. Le compilateur les comprend et leur permettra donc de s'étendre implicitement sur plusieurs lignes. Aucun support de ce type n'a été ajouté pour les chaînes multilignes. L'ajout d'un tel support est beaucoup plus facile que les littéraux XML, il n'a tout simplement pas rencontré la barre pour cette version.
JaredPar
38

J'ai utilisé cette variante:

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

il autorise <> dans la chaîne

ozzy432836
la source
1
Excellente technique, mais il faudra peut-être ajouter quelques références à votre projet pour le faire fonctionner. Voir: msdn.microsoft.com/en-us/library/bb531455%28v=vs.90%29.aspx et stackoverflow.com/a/28654126/3175562
Mike
30

Les chaînes multilignes sont disponibles depuis Visual Studio 2015.

Dim sql As String = "
    SELECT ID, Description
    FROM inventory
    ORDER BY DateAdded
"

Vous pouvez les combiner avec une interpolation de chaîne pour maximiser leur utilité:

Dim primaryKey As String = "ID"
Dim inventoryTable As String = "inventory"

Dim sql As String = $"
    SELECT {primaryKey}, Description
    FROM {inventoryTable}
    ORDER BY DateAdded
"

Notez que les chaînes commencent par interpolées $et vous avez besoin de prendre soin de ", {et }contenues à l' intérieur - les convertir en "", {{ou }}respectivement.

Ici, vous pouvez voir la coloration syntaxique réelle des parties interpolées de l'exemple de code ci-dessus:

entrez la description de l'image ici

Si vous vous demandez si leur reconnaissance par l'éditeur Visual Studio fonctionne également avec le refactoring (par exemple, renommer en masse les variables), alors vous avez raison, le refactoring de code fonctionne avec celles-ci. Sans mentionner qu'ils prennent également en charge IntelliSense, le comptage de références ou l'analyse de code.

miroxlav
la source
20

Les littéraux de chaîne multiligne sont introduits dans Visual Basic 14.0 - https://roslyn.codeplex.com/discussions/571884

Vous pouvez ensuite utiliser dans l'aperçu VS2015, disponible maintenant - http://www.visualstudio.com/en-us/downloads/visual-studio-2015-downloads-vs (notez que vous pouvez toujours utiliser VS2015 même si vous ciblez un version du framework .NET)

Dim multiline = "multi
line
string"

Les chaînes VB sont désormais fondamentalement les mêmes que les chaînes verbatim C # - elles ne prennent pas en charge les séquences d'échappement anti-slash comme \ n, et elles autorisent les retours à la ligne dans la chaîne, et vous échappez le symbole de guillemet avec des guillemets doubles ""

Lucian Wischik
la source
2
Merci Lucian d'avoir ajouté des chaînes multi-lignes dans le VB. Vous pouvez peut-être mettre à jour votre réponse, car VS 2015 est désormais RTM. Et peut-être que vous pouvez également pousser quelqu'un dans votre entreprise pour mettre à jour l' article MSDN associé .
miroxlav
14

c'était un article vraiment utile pour moi, mais personne n'a mentionné comment concaténer au cas où vous voudriez envoyer des variables, ce que vous devez faire 99% du temps.

... <% = variable %> ...

Voici comment procéder:

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

Destructeur
la source
17
Dans ce cas, vous souhaitez éviter la concaténation et utiliser à la place des paramètres SQL car ils sont plus efficaces pour se protéger des attaques par injection SQL. Cependant, je peux voir que cela est utile pour la génération SQL dynamique (sans passer par l'utilisateur).
Chad Levy
10

Eh bien, puisque vous semblez être au courant de votre python, puis-je vous suggérer de copier votre texte en python, comme:

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

puis faites un:

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

ou

  print ' & _ \n'.join(map(lambda s: '"%s"' % s, s.split('\n')))

#    "this is gonna" & _ 
#    "last quite a" & _ 
#    "few lines"

alors au moins vous pouvez le copier et le mettre dans votre code VB. Des points bonus si vous liez un raccourci clavier (le plus rapide à obtenir avec: Autohotkey ) pour le faire pour tout ce qui se trouve dans votre tampon de collage . La même idée fonctionne bien pour un formateur SQL.

RichardJohnn
la source
8

Littéraux de chaîne multilignes dans vb.net à l'aide de la classe 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
la source
7

Pour moi, c'est la chose la plus ennuyeuse à propos de VB en tant que langue. Sérieusement, j'ai une fois écrit la chaîne dans un fichier et écrit du code quelque chose du genre:

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

juste pour que je puisse tester la requête directement sur le serveur SQL si j'en ai besoin.

Ma méthode actuelle consiste à utiliser une procédure stockée sur le serveur SQL et à l'appeler simplement pour que je puisse passer des paramètres à la requête, etc.

Osiname
la source
5

J'ai compris comment utiliser à la fois <! [CDATA [avec <% = pour les variables, ce qui vous permet de coder sans souci.

Vous devez essentiellement terminer les balises CDATA avant la variable VB, puis la rajouter après pour que CDATA ne capture pas le code VB. Vous devez envelopper le bloc de code entier dans une balise car vous aurez plusieurs blocs CDATA.

Dim script As String = <code><![CDATA[
  <script type="text/javascript">
    var URL = ']]><%= domain %><![CDATA[/mypage.html';
  </script>]]>
</code>.value
Nelson
la source
3

Vous pouvez (devriez?) Mettre la chaîne dans un fichier de ressources (par exemple "Mon projet" / Resources) et ensuite l'obtenir avec

 Dim a = My.Resources.Whatever_you_chose
habakuk
la source
3

Avertissement: j'adore le python. Ses chaînes multilignes ne sont qu'une des raisons.

Mais je fais aussi VB.Net, alors voici mon raccourci pour de longues chaînes plus lisibles.

  Dim lines As String() = {
    "Line 1",
    "Line 2",
    "Line 3"
  }
  Dim s As String = Join(lines, vbCrLf)
John Samuel Anderson
la source
1
Vous avez besoin de _ à la fin de la ligne pour chaque "Ligne .." qui a l'air moche.
Kenji Noguchi
2
En fait, non. Les versions ultérieures de VB (2010 et plus tard je pense?) Ne nécessitent pas de _ dans de nombreux cas, y compris l'exemple montré ici.
Darryl le
2

vous pouvez utiliser XML pour cela comme

dim vrstr as string = <s>
    some words
    some words
    some
    words
</s>
Jack Gajanan
la source
1

dans Visual studio 2010 (VB NET), j'essaye ce qui suit et fonctionne bien

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
la source
0

Si vous avez besoin d'un littéral XML dans VB.Net avec une variable de code de ligne, voici comment procéder:

<Tag><%= New XCData(T.Property) %></Tag>
Ori Samara
la source
Notez bien pourquoi vous mentionnez un littéral XML ici, ne voyez pas XML mentionné dans la question d'origine.
Kmeixner
0

Vous pouvez également utiliser la System.Text.StringBuilderclasse de cette manière:

Dim sValue As New System.Text.StringBuilder
sValue.AppendLine("1st Line")
sValue.AppendLine("2nd Line")
sValue.AppendLine("3rd Line")

Ensuite, vous obtenez la chaîne multiligne en utilisant:

sValue.ToString()
ᗩИ Ꭰ ЯƎᗩ
la source
-1

Puisqu'il s'agit d'un problème de lisibilité, j'ai utilisé le code suivant:

MySql = ""
MySql = MySql & "SELECT myTable.id"
MySql = MySql & " FROM myTable"
MySql = MySql & " WHERE myTable.id_equipment = " & lblId.Text
Zac
la source
1
C'est mauvais. Vous venez de créer 4 instances de chaîne
TS
J'ai hérité d'un ancien code VB6 que je dois porter sur VB.NET qui en est plein! :( Dans ce cas, je préfère sacrifier les performances pour maintenir la lisibilité.
Zac
Vous n'êtes pas obligé. Vous pouvez toujours concaténer sans réattribuer une variable et formater dans ces lignes
TS
Dans mon cas, il n'est pas possible de passer à la syntaxe correcte car je devrais modifier un tas de code complet et il ne reste plus de temps sur le projet.
Zac
-1

Utilisez vbCrLfou vbNewLine. Cela fonctionne avec les MessageBox et de nombreux autres contrôles que j'ai testés.

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

Il affichera deux MessageBox identiques avec 2 lignes.

LuizLoyola
la source
-9

Non, VB.NET n'a pas encore une telle fonctionnalité. Il sera cependant disponible dans la prochaine itération de VB (Visual Basic 10) ( lien )

Jason Irwin
la source
Vous êtes sûr? Je sais qu'ils vont autoriser les instructions multilignes, mais vont-ils aussi autoriser les chaînes multilignes ? Je veux dire "bonjour le monde <newline>"?
Mehrdad Afshari
1
La suppression du caractère de continuation de ligne et des chaînes littérales multilignes sont des fonctionnalités différentes.
JaredPar
-16

si c'est comme C # (je n'ai pas VB.Net installé), vous pouvez préfixer une chaîne avec @

foo = @"Multiline
String"

ceci est également utile pour des choses comme @ "C: \ Windows \ System32 \" - il désactive essentiellement l'échappement et active la multiligne.

Andy Hohorst
la source