Cadenas multilínea en VB.NET


144

¿Hay alguna manera de tener cadenas multilínea en VB.NET como Python

a = """
multi
line
string
"""

o PHP?

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

Por supuesto algo que no es

"multi" & _
"line

1
Por cierto: '"multi" & _ <línea nueva> "línea"' es un literal de cadena, no dos. Sin embargo, sigue siendo feo.
Joel Coehoorn


Mis dos centavos: en VS 2017 se compilaría su código VB.NET.
ᗩИ Ꭰ ЯƎᗩ

Respuestas:


223

Puede usar XML Literals para lograr un efecto similar:

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

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

Recuerde que si tiene caracteres especiales, debe usar un bloque CDATA:

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

ACTUALIZACIÓN 2015:

Los literales de cadena de varias líneas se introdujeron en Visual Basic 14 (en Visual Studio 2015 ). El ejemplo anterior ahora se puede escribir como:

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.

Los detalles se agregan al repositorio Github de Roslyn New-Language-Features-in-VB-14 .


¿Cómo puedes hacer reemplazos variables allí? como "a =" & someint & ","
Christopher Mahan

1
@Christopher: por lo general, me resulta más legible colocar tokens en la cadena constante y luego reemplazarlos. Entonces s="... a=~someint~ ..."y entonces s=s.Replace("~someint~', SomeInt).
Herb Caudill

Esto no parece funcionar con la compilación dinámica: CodeDomProvider.CreateProvider ("VisualBasic"). CompileAssemblyFromFile (<opciones>, <archivo .vb con la sintaxis del truco anterior>) ... ¿Alguna idea? ¿Es esto solo el azúcar sintáctico VS 2010?
Chad

1
@romkyns No es cierto, descubrí cómo usar CDATA y aún ser capaz de incrustar usando <% =%> Ver aquí
Nelson

1
¡Increíble! ¿Cómo se mantiene la sangría del código sin introducirlo en el literal bajo la sintaxis más reciente?
Panzercrisis

50

VB.Net no tiene esa característica y no aparecerá en Visual Studio 2010. La característica a la que se refiere jirwin se llama continuación de línea implícita. Tiene que ver con eliminar el _ de una declaración o expresión de varias líneas. Esto elimina la necesidad de terminar una cadena de varias líneas con _ pero todavía no hay un literal de cadena de varias líneas en VB.

Ejemplo para cadena multilínea

Visual Studio 2008

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

Visual Studio 2010

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

Entonces, ¿cómo funciona para los literales XML? O es posible, o los literales XML están usando una técnica diferente, y si es una técnica diferente, entonces una que podría extenderse a cadenas de varias líneas.
mellamokb

1
Los literales XML @mellamokb son ... especiales por falta de una palabra mejor. El compilador los comprende y, por lo tanto, les permitirá abarcar varias líneas implícitamente. No se agregó dicho soporte para cadenas de varias líneas. Agregar dicho soporte es mucho más fácil que los literales XML, simplemente no cumplió con los requisitos para esa versión.
JaredPar

38

Usé esta 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()

permite <> en la cadena


1
Gran técnica, pero es posible que tenga que agregar algunas referencias a su proyecto para que funcione. Ver: msdn.microsoft.com/en-us/library/bb531455%28v=vs.90%29.aspx y stackoverflow.com/a/28654126/3175562
Mike

30

Las cadenas de varias líneas están disponibles desde Visual Studio 2015.

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

Puede combinarlos con la interpolación de cadenas para maximizar la utilidad:

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

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

Tenga en cuenta que las cadenas comienzan con interpolados $y hay que cuidar ", {y }contenían el interior - convertirlos en "", {{o}} respectivamente.

Aquí puede ver el resaltado de sintaxis real de las partes interpoladas del ejemplo de código anterior:

ingrese la descripción de la imagen aquí

Si se pregunta si su reconocimiento por parte del editor de Visual Studio también funciona con la refactorización (por ejemplo, renombrar en masa las variables), entonces tiene razón, la refactorización de código funciona con estas. Sin mencionar que también admiten IntelliSense, recuento de referencias o análisis de código.


20

Los literales de cadena multilínea se introducen en Visual Basic 14.0 - https://roslyn.codeplex.com/discussions/571884

Puede usarlo en la Vista previa de VS2015, ahora disponible: http://www.visualstudio.com/en-us/downloads/visual-studio-2015-downloads-vs (tenga en cuenta que todavía puede usar VS2015 incluso cuando se dirige a una persona mayor versión del marco .NET)

Dim multiline = "multi
line
string"

Las cadenas VB ahora son básicamente las mismas que las cadenas textuales C #: no admiten secuencias de escape de barra invertida como \ n, y permiten nuevas líneas dentro de la cadena, y usted escapa del símbolo de comillas con comillas dobles ""


2
Gracias Lucian por agregar cadenas de varias líneas en el VB. Tal vez pueda actualizar su respuesta, porque VS 2015 ahora es RTM. Y tal vez también pueda meter a alguien en su empresa para actualizar el artículo relacionado de MSDN .
miroxlav

14

Este fue un artículo realmente útil para mí, pero nadie mencionó cómo concatenar en caso de que desee enviar algunas variables, que es lo que debe hacer el 99% del tiempo.

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

Así es como lo haces:

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


17
En este caso, desea evitar la concatenación y, en su lugar, utilizar parámetros SQL, ya que son mejores para reforzar los ataques de inyección SQL. Sin embargo, puedo ver que esto es útil para la generación dinámica de SQL (sin pasar por la entrada del usuario).
Chad Levy

10

Bueno, dado que parece estar en su python, le sugiero que copie su texto en python, como:

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

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

o

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

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

entonces al menos puedes copiar eso y ponerlo en tu código VB. Puntos de bonificación si vincula una tecla de acceso rápido (la más rápida para obtener: Autohotkey ) para hacer esto por lo que sea que esté en su búfer de pegado. La misma idea funciona bien para un formateador SQL.


8

Literales de cadena de varias líneas en vb.net utilizando la clase 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

Para mí eso es lo más molesto de VB como lenguaje. En serio, una vez escribí la cadena en un archivo y escribí algo en el código:

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

solo para poder probar la consulta directamente en el servidor SQL si es necesario.

Mi método actual es usar un procedimiento almacenado en SQL Server y simplemente llamarlo para poder pasar parámetros a la consulta, etc.


5

Descubrí cómo usar ambos <! [CDATA [junto con <% = para las variables, lo que te permite codificar sin preocupaciones.

Básicamente, debe terminar las etiquetas CDATA antes de la variable VB y luego volver a agregarlas después para que el CDATA no capture el código VB. Necesita envolver todo el bloque de código en una etiqueta porque tendrá múltiples bloques CDATA.

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

3

Podría (debería?) Poner la cadena en un archivo de recursos (por ejemplo, "Mi proyecto" / Recursos) y luego obtenerlo con

 Dim a = My.Resources.Whatever_you_chose

3

Descargo de responsabilidad: me encanta python. Sus cadenas de varias líneas son solo una razón.

Pero también hago VB.Net, así que aquí está mi atajo para cadenas largas más legibles.

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

1
Necesitas _ al final de la línea para cada "Línea .." que se ve fea.
Kenji Noguchi

2
En realidad no lo haces. Las versiones posteriores de VB (2010 y posterior, creo?) No requieren un _ en muchos casos, incluido el ejemplo que se muestra aquí.
Darryl

2

puedes usar XML para esto como

dim vrstr as string = <s>
    some words
    some words
    some
    words
</s>

1

en Visual Studio 2010 (VB NET) intento lo siguiente y funciona 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>


0

Si necesita un literal XML en VB.Net con una variable de código de línea, así es como lo haría:

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

Tenga en cuenta por qué está mencionando un literal XML aquí, no vea el XML mencionado en la pregunta original.
Kmeixner

0

También puede usar la System.Text.StringBuilderclase de esta manera:

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

Luego obtienes la cadena multilínea usando:

sValue.ToString()

-1

Como se trata de un problema de legibilidad, he utilizado el siguiente código:

MySql = ""
MySql = MySql & "SELECT myTable.id"
MySql = MySql & " FROM myTable"
MySql = MySql & " WHERE myTable.id_equipment = " & lblId.Text

1
Esto es malo. Acaba de crear 4 instancias de cadena
TS

¡Heredé un código VB6 heredado que tengo que portar a VB.NET que está lleno de estos! :( En este caso, prefiero sacrificar el rendimiento para mantener la legibilidad.
Zac

No tienes que hacerlo Siempre se puede concatenar sin reasignar una variable y formatear dentro de esas líneas
TS

En mi caso, no es aplicable cambiar a la sintaxis correcta, ya que debería modificar un montón de código completo y no queda tiempo para el proyecto.
Zac

-1

Use vbCrLfo vbNewLine. Funciona con MessageBoxes y muchos otros controles que probé.

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

Mostrará dos MessageBoxes idénticos con 2 líneas.


-9

No, VB.NET todavía no tiene esa característica. Sin embargo, estará disponible en la próxima iteración de VB (visual basic 10) ( enlace )


¿Estás seguro? Sé que permitirán declaraciones multilínea, pero ¿también permitirán cadenas multilínea ? Me refiero a "hola <línea nueva> mundo"?
Mehrdad Afshari

1
La eliminación del carácter de continuación de línea y las cadenas literales de varias líneas son características diferentes.
JaredPar 01 de

-16

si es como C # (no tengo instalado VB.Net), puede prefijar una cadena con @

foo = @"Multiline
String"

Esto también es útil para cosas como @ "C: \ Windows \ System32 \": esencialmente desactiva el escape y activa la multilínea.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.