多行字符串变量

36
在 .Net (C# 和 VB.NET) 中,如果我有一个多行文本,就像这样:
__   __                 _                       
\ \ / /                | |                      
 \ V /___  _   _ _ __  | |     ___   __ _  ___  
  \ // _ \| | | | '__| | |    / _ \ / _` |/ _ \ 
  | | (_) | |_| | |    | |___| (_) | (_| | (_) |
  \_/\___/ \__,_|_|    \_____/\___/ \__, |\___/ 
                                     __/ |      
                                    |___/       

我可以像这样设置变量吗?

Dim Logo As String = ("
__   __                 _                       
\ \ / /                | |                      
 \ V /___  _   _ _ __  | |     ___   __ _  ___  
  \ // _ \| | | | '__| | |    / _ \ / _` |/ _ \ 
  | | (_) | |_| | |    | |___| (_) | (_| | (_) |
  \_/\___/ \__,_|_|    \_____/\___/ \__, |\___/ 
                                     __/ |      
                                    |___/       ")

Console.WriteLine(Logo)

使用这个而不是else:

    Console.WriteLine("__   __                                         ")
    Console.WriteLine("\ \ / /                | |                      ")
    Console.WriteLine(" \ V /___  _   _ _ __  | |     ___   __ _  ___  ")
    Console.WriteLine("  \ // _ \| | | | '__| | |    / _ \ / _` |/ _ \ ")
    Console.WriteLine("  | | (_) | |_| | |    | |___| (_) | (_| | (_) |")
    Console.WriteLine("  \_/\___/ \__,_|_|    \_____/\___/ \__, |\___/ ")
    Console.WriteLine("                                     __/ |      ")
    Console.WriteLine("                                    |___/       ")

...否则选择此项:

            Dim Logo As String = ( _
"__   __                 _                       " & vbNewLine & _
"\ \ / /                | |                      " & vbNewLine & _
" \ V /___  _   _ _ __  | |     ___   __ _  ___  " & vbNewLine & _
"  \ // _ \| | | | '__| | |    / _ \ / _` |/ _ \ " & vbNewLine & _
"  | | (_) | |_| | |    | |___| (_) | (_| | (_) |" & vbNewLine & _
"  \_/\___/ \__,_|_|    \_____/\___/ \__, |\___/ " & vbNewLine & _
"                                     __/ |      " & vbNewLine & _
"                                    |___/       ")

4
这看起来太复古了,我预计人们会开始谈论AT代码和BBS密码。 - Jeff Watkins
这是我更愿意添加为资源的内容。 - hometoast
6个回答

64

您最初将此标记为C#,但显示的却是VB代码。对于C#,请使用@指示符:

string myText =
@"line 1
line 2
line 3"

请注意,如果你不想让你的字符串开头有一个空行,请确保你将 @" 放在你的文本的第一行和同一行,就像我上面所做的那样。

对于VB.NET,它没有直接支持这个功能,但是你可以使用来自这个答案中的好方法来解决它:

Dim s As String = <a>line 1
line 2
line 3</a>.Value

同时考虑创建一个字符串资源;你可以在其中添加换行符(请确保使用shift-enter,参见此答案中的注意事项),然后使用类似于以下内容的方式加载资源

Dim myString As String = My.Resources.MyString

Visual Studio 2015更新:显然vb.net在这里是个难点,但从VS2015开始,它支持多行字符串的方式类似于c#原始字符串(verbatim strings),但不需要用前导符@

请注意,嵌入在字符串中的行终止符是您所选编辑器提供的实际行终止符。对于VS来说,这是\r\n

示例:

enter image description here

在此处

对于VS2015/C# 6中引入的新插值字符串(interpolated strings),需要在C#中以$@为前缀。

string multiline = $@"
[configuration]
name=Fred
age={age}";

在VB.NET中,只需省略@

Dim multiline As String = $"
[configuration]
name=Fred
age={age}"

1
根据您的数据中的字符,您可能还想放置一个内部XML CDATA元素,以防止一些字符的编码问题。例如:<a><![CDATA[您的多行数据]]></a>.Value - DarrenMB
如果你想在C# 6/VS 2015中同时使用多行字符串字面量和字符串插值,你需要在字符串开头使用$@(而不是@$)。 - Thomas Denney
在至少VB.NET的VS2015中,您可以只是打开一个带引号的字符串并输入,无需任何前置内容,只需像声明单行变量一样输入内容,但按Enter键添加任何新行。我以前使用'“&_”追加来完成此操作,这种新支持的方式更好,因为缩进要容易得多! :-) - Liam Wheldon

17

在C#中,您可以使用原始字符串(@),就像这样:

        private string Logo = @"
__   __                 _                       
\ \ / /                | |                      
 \ V /___  _   _ _ __  | |     ___   __ _  ___  
  \ // _ \| | | | '__| | |    / _ \ / _` |/ _ \ 
  | | (_) | |_| | |    | |___| (_) | (_| | (_) |
  \_/\___/ \__,_|_|    \_____/\___/ \__, |\___/ 
                                     __/ |      
                                    |___/       ";

14

使用原义字符串。

@ 符号告诉字符串构造函数忽略换行符。

有关更多信息,请参见MSDN。字符串字面值与原义字符串

例如

string verbatim = @"v
                    e
                    r
                    batim"

你的例子

Dim Logo As String = (@"
__   __                 _                       
\ \ / /                | |                      
 \ V /___  _   _ _ __  | |     ___   __ _  ___  
  \ // _ \| | | | '__| | |    / _ \ / _` |/ _ \ 
  | | (_) | |_| | |    | |___| (_) | (_| | (_) |
  \_/\___/ \__,_|_|    \_____/\___/ \__, |\___/ 
                                     __/ |      
                                    |___/       ")

Console.WriteLine(Logo)

3
不仅仅是换行符,还包括所有特殊符号如 \r、\n 等。 - Dzmitry Martavoi
@ 是一个原义字符串字面量。还有一些其他的字面量,例如 \b,'a',\n,\r ... @ 通常被称为原义字符串,好的解释 +1。 - Davut Gürbüz

4

是的,您应该使用 @ 符号:

string t = @"t
e
s
t"

2

有点像……

做法如下:

Dim logo = " " & vbCrLf & _
"__   __                                         " & vbCrLf & _
"\ \ / /                | |                      " & vbCrLf & _

etc.


1

C# 11和.NET 7版本使用原始字符串字面量

string multilineLogo = """
__   __                 _                       
\ \ / /                | |                      
 \ V /___  _   _ _ __  | |     ___   __ _  ___  
  \ // _ \| | | | '__| | |    / _ \ / _` |/ _ \ 
  | | (_) | |_| | |    | |___| (_) | (_| | (_) |
  \_/\___/ \__,_|_|    \_____/\___/ \__, |\___/ 
                                     __/ |      
                                    |___/       
""";

Dim MultilineLogo = """
__   __                 _                       
\ \ / /                | |                      
 \ V /___  _   _ _ __  | |     ___   __ _  ___  
  \ // _ \| | | | '__| | |    / _ \ / _` |/ _ \ 
  | | (_) | |_| | |    | |___| (_) | (_| | (_) |
  \_/\___/ \__,_|_|    \_____/\___/ \__, |\___/ 
                                     __/ |      
                                    |___/       
""";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接