VB.NET의 여러 줄 문자열


144

Python과 같은 VB.NET에서 여러 줄 문자열을 갖는 방법이 있습니까?

a = """
multi
line
string
"""

아니면 PHP?

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

물론 그렇지 않은 것

"multi" & _
"line

1
BTW : ' "multi"& _ <newline> "line"'은 두 개가 아닌 하나의 문자열 리터럴입니다. 그래도 여전히 추악합니다.
Joel Coehoorn


내 두 센트 : VS 2017에서 VB.NET 코드가 컴파일됩니다.
ᗩИ Ꭰ ЯƎᗩ

답변:


222

XML 리터럴 을 사용 하여 비슷한 효과를 얻을 수 있습니다 .

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 14 ( Visual 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.

VB-14 Github 저장소에 Roslyn New-Language-Features 기능 이 추가되었습니다 .


거기에서 어떻게 변수 교체를 할 수 있습니까? "a ="& someint & ","
Christopher Mahan

1
@Christopher-일반적으로 토큰을 문자열 상수에 넣은 다음 대체하는 것이 더 읽기 쉽습니다. 그래서 s="... a=~someint~ ..."다음 s=s.Replace("~someint~', SomeInt).
Herb Caudill

동적 컴파일에서는 작동하지 않는 것 같습니다 : CodeDomProvider.CreateProvider ( "VisualBasic"). CompileAssemblyFromFile (<options>, <위의 트릭 구문이있는 .vb 파일>) ... 이것은 VS 2010 구문 설탕입니까?
Chad

1
@romkyns 사실이 아닙니다. CDATA를 사용하는 방법을 알아 냈지만 여전히 <% = %>를 사용하여 포함 할 수 있습니다. 여기를
Nelson

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.aspxstackoverflow.com/a/28654126/3175562
마이크

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 Preview에서 http://www.visualstudio.com/en-us/downloads/visual-studio-2015-downloads-vs를 사용할 수 있습니다 (이전 버전을 타겟팅 할 때도 VS2015를 계속 사용할 수 있음에 유의하십시오) .NET 프레임 워크 버전)

Dim multiline = "multi
line
string"

VB 문자열은 기본적으로 C # 동사 문자열과 동일합니다. \ n과 같은 백 슬래시 이스케이프 시퀀스를 지원하지 않으며 문자열 내에서 줄 바꿈을 허용하며 큰 따옴표 ""로 따옴표 기호를 이스케이프합니다.


2
VB에 여러 줄 문자열을 추가 한 Lucian에게 감사합니다. VS 2015는 이제 RTM이므로 답변을 업데이트 할 수 있습니다. 회사의 누군가를 훔쳐 관련 MSDN 기사 를 업데이트 할 수도 있습니다 .
miroxlav

14

이것은 나에게 정말 유용한 기사 였지만 아무도 연결 하는 방법에 대해 언급하지 않았습니다. 99 %의 시간을 할애 해야하는 변수를 보내고 싶을 때 .

... <% = 변수 %> ...

방법은 다음과 같습니다.

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


17
이 경우 연결을 피하고 대신 SQL 주입 공격에 대한 보안 강화에 더 나은 SQL 매개 변수를 사용하려고합니다. 그래도 이것이 사용자 입력을 거치지 않고 동적 SQL 생성에 유용하다는 것을 알 수 있습니다.
채드 레비

10

글쎄, 파이썬을 사용하는 것처럼 보이므로 텍스트를 파이썬으로 복사하는 것이 좋습니다.

 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 코드에 넣을 수 있습니다. 붙여 넣기 버퍼에있는 모든 작업에 대해 핫키를 바인딩하는 경우 보너스 포인트 : Autohotkey 를 사용하면 가장 빠릅니다 . SQL 포매터에도 동일한 아이디어가 효과적입니다.


8

XElement 클래스를 사용하는 vb.net의 여러 줄 문자열 리터럴

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 Server에서 저장 프로 시저를 사용하고 호출하여 매개 변수를 쿼리 등에 전달할 수 있습니다.


5

변수에 <! [CDATA [와 <% =를 함께 사용하여 걱정없이 코딩 할 수있는 방법을 알아 냈습니다.

기본적으로 VB 변수 전에 CDATA 태그를 종료 한 다음 CDATA가 VB 코드를 캡처하지 않도록 다시 추가해야합니다. CDATA 블록이 여러 개 있으므로 전체 코드 블록을 태그로 묶어야합니다.

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

3

문자열을 리소스 파일 (예 : "My Project"/ Resources)에 넣은 다음

 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
보기 흉한 것처럼 보이는 각 "줄 .."에 대해 줄 끝에서 _가 필요합니다.
Kenji Noguchi

2
실제로는 그렇지 않습니다. 이후 버전의 VB (2010 이상)는 여기에 표시된 예를 포함하여 많은 경우에 _가 필요하지 않습니다.
Darryl

2

이 같은 XML을 사용할 수 있습니다

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

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

VB.Net에서 라인 코드 변수가있는 XML 리터럴이 필요한 경우 다음과 같이하십시오.

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

여기서 XML 리터럴을 언급하는 이유를 확인하십시오. 원래 질문에 XML이 언급되어 있지 않습니다.
Kmeixner

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

나는 VB.NET으로 포팅 해야하는 레거시 VB6 코드를 상속 받았다. :(이 경우 가독성을 유지하기 위해 성능을 희생하는 것을 선호합니다.
Zac

당신은 필요가 없습니다. 변수를 다시 할당하지 않고 연결하고 해당 행 내에서 형식을 지정할 수 있습니다.
TS

필자의 경우 전체 코드를 수정해야하고 프로젝트에 남은 시간이 없으므로 올바른 구문으로 전환 할 수 없습니다.
Zac

-1

vbCrLf또는을 사용하십시오 vbNewLine. MessageBoxes 및 내가 테스트 한 다른 많은 컨트롤과 함께 작동합니다.

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

두 줄로 된 동일한 두 개의 MessageBox가 표시됩니다.


-9

아니요, VB.NET에는 아직 그러한 기능이 없습니다. VB (visual basic 10)의 다음 반복에서 사용할 수 있지만 ( link )


확실 해요? 여러 줄 문을 허용하지만 여러 줄 문자열 도 허용 합니까? "안녕 <newline> 세계"를 의미합니까?
Mehrdad Afshari

1
줄 연속 문자와 여러 줄 리터럴 문자열을 제거하는 것은 다른 기능입니다.
JaredPar

-16

C #과 같은 경우 (VB.Net이 설치되어 있지 않음) 문자열 앞에 @를 붙일 수 있습니다

foo = @"Multiline
String"

이는 @ "C : \ Windows \ System32 \"와 같은 경우에도 유용합니다. 기본적으로 이스케이프 기능을 해제하고 여러 줄을 켭니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.