web-dev-qa-db-fra.com

Chaînes multilignes dans VB.NET

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
130
pistacchio

Vous pouvez utiliser 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:

Des littéraux multi-lignes ont été introduits dans Visual Basic 14 (dans Visual Studio 2015 ). L'exemple ci-dessus peut maintenant être écrit:

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.

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

213
Vincenzo Alcamo

VB.Net ne possède pas cette fonctionnalité et il not viendra dans Visual Studio 2010. La fonctionnalité référencée par jirwin est appelée continuation de ligne implicite. Cela concerne la suppression du _ d'une déclaration ou d'une expression multiligne. Cela supprime la nécessité de terminer une chaîne multiligne avec _ mais il n'y a toujours pas de littéral de chaîne multiligne dans VB.

Exemple pour une chaîne multiligne

Visual Studio 2008

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

Visual Studio 2010

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

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 permet <> dans la chaîne

37
ozzy432836

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 string pour maximiser l'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 interpolées commencent par $ et que vous devez vous occuper de ", { et } contenus à l'intérieur - convertissez-les en "", {{ ou }} respectivement.

Ici, vous pouvez voir la mise en évidence de la syntaxe réelle des parties interpolées de l'exemple de code ci-dessus:

 enter image description here

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

24
miroxlav

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

Vous pouvez ensuite utiliser le VS2015 Preview - http://www.visualstudio.com/en-us/downloads/visual-studio-2015-downloads-vs (notez que vous pouvez toujours utiliser VS2015 même lorsque vous ciblez une ancienne version du framework .NET)

Dim multiline = "multi
line
string"

Les chaînes VB sont désormais essentiellement les mêmes que les chaînes verbatim C # - elles ne prennent pas en charge les séquences d'échappement avec une barre oblique inverse comme\n, elles autorisent les nouvelles lignes dans la chaîne et vous échappez le symbole de citation par des guillemets ""

20
Lucian Wischik

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

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

Voici comment vous le faites:

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

14
Destructerator

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

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

alors 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 copier cela et le mettre dans votre code VB. Points bonus si vous liez un raccourci clavier (Le plus rapide à obtenir avec: Autohotkey ) pour ce faire, quel que soit le contenu de votre tampon de collage. La même idée fonctionne bien pour un formateur SQL.

10
RichardJohnn

Littéraux de chaîne multiligne dans vb.net utilisant 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
8
windchaser

Pour moi, c’est la chose la plus agaçante à propos de VB en tant que langage . Sérieusement, j’ai une fois écrit la chaîne dans un fichier et écrit du code dans le sens suivant:

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

juste pour que je puisse tester la requête directement sur le serveur SQL si besoin est.

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

7
Osiname

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

En gros, vous devez terminer les balises CDATA avant la variable VB, puis l'ajouter de nouveau après afin 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
5
Nelson

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

 Dim a = My.Resources.Whatever_you_chose
3
habakuk

Disclaimer: J'adore le python. Ses chaînes multi-lignes ne sont qu'une des raisons. 

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

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

vous pouvez utiliser XML pour cela comme

dim vrstr as string = <s>
    some words
    some words
    some
    words
</s>
2
Jack Gajanan

Disponible dans Visual Basic 14 dans Visual Studio 2015 https://msdn.Microsoft.com/en-us/magazine/dn890368.aspx

Mais pas encore supporté par R #. La bonne nouvelle est qu'ils seront bientôt pris en charge! Veuillez voter sur Youtrack pour informer JetBrains que vous en avez également besoin.

1
Bart VdA

dans Visual studio 2010 (VB NET), j’essaie les solutions suivantes 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>
1
user1166557

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

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

Utilisez vbCrLf ou vbNewLine. Cela fonctionne avec MessageBoxes et beaucoup d'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 montrera deux MessageBox identiques avec 2 lignes.

0
LuizLoyola

Vous pouvez également utiliser la classe System.Text.StringBuilder de cette façon:

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()
0
ᗩИᎠЯƎᗩ