2009-10-14 27 views
27

是否有一种体面的方式在C#中声明一个长单行字符串,以便在编辑器中声明和/或查看字符串是不可能的?在C中声明一个looooong单行字符串#

我知道的选项有:

1:让它运行。这很糟糕,因为你的字符串在屏幕的右侧移动,让开发人员阅读消息时不得不烦人滚动和阅读。

string s = "this is my really long string. this is my really long string. this is my really long string. this is my really long string. this is my really long string. this is my really long string. this is my really long string. this is my really long string. "; 

2:@ + newlines。这在代码中看起来不错,但是会在字符串中引入换行符。此外,如果你希望它在代码中看起来不错,那么你不仅会得到换行符,而且还会在字符串的每一行的开始处出现难处理的空间。

string s = @"this is my really long string. this is my long string. 
      this line will be indented way too much in the UI. 
This line looks silly in code. All of them suffer from newlines in the UI."; 

3:"" + ...这工作正常,但超级沮丧类型。如果我需要在某处添加一行文本,我必须更新各种+的文本并移动文本。

string s = "this is my really long string. this is my long string. " + 
      "this will actually show up properly in the UI and looks " + 
      "pretty good in the editor, but is just a pain to type out " + 
      "and maintain"; 

4:string.format or string.concat。基本上和上面一样,但没有加号。具有相同的优点和缺点。

难道真的没有办法做到这一点吗?

回答

7

这取决于字符串将如何结束使用。这里的所有答案都是有效的,但环境很重要。如果长字符串“s”将被记录下来,它应该与测井后卫测试包围,如本log4net的例子:

if (log.IsDebug) { 
    string s = "blah blah blah" + 
    // whatever concatenation you think looks the best can be used here, 
    // since it's guarded... 
} 

如果s是要长串将被显示给用户,然后开发者艺术的答案是最好的选择......那些应该在资源文件中。

作其他用途(生成SQL查询字符串,写入文件,[但这些再考虑资源],等...),你在哪里串联不仅仅是文字,考虑的StringBuilder作为瓦埃勒Dalloul建议,特别是如果你的字符串有可能在一个函数中结束,那么在远期的某个日期,在一个时间关键的应用程序中可以多次调用这些函数(所有这些调用总和)。我这样做,例如,当我建立一个SQL查询,其中有参数是变量。

除此之外,不,我不知道任何两个看起来很漂亮并且很容易输入的东西(尽管单词包装建议是一个好主意,但它可能无法很好地转化为差异工具,代码打印输出,或代码审查工具)。那些是休息时间。 (我个人使用加号方式使行包装整齐打印和代码审查)。

+3

字符串文字的连接由C#编译器处理,因此在运行时使用声明为“”的字符串时零开销x“+”y“+”Z“+ ...' – 2009-10-21 02:52:32

+0

啊,@ 280Z28当然是正确的!我添加了一些关于何时使用StringBuilder方法的说明(当您将变量与您的ltierals混合使用时)。 – 2009-10-21 14:49:48

59

有一种方法。把你很长的字符串放在资源中。你甚至可以在那里放长篇文章,因为它是文本应该在的地方。直接在代码中使用它们是一个非常糟糕的做法。

+6

我想改变我的VS配色方案,使字符串一些丑陋的颜色显示。总是提醒我发生了一些不好的事情。 – DavidGouge 2009-10-14 12:11:04

+0

不好的做法是的,但并不总是可以在传统软件中解决(项目经理没有看到灯光)。 – stevehipwell 2009-10-14 12:11:48

+1

@ Stevo3000:我相信问题作者有能力解决这个问题。这就是他寻求建议的原因。 – 2009-10-14 12:12:59

-1

你可以使用StringBuilder

8

如果使用Visual Studio

Tools > Options > Text Editor > All Languages > Word Wrap 

我相信其他任何文本编辑器(包括记事本)就能做到这一点!

+0

我喜欢这个选项的代码,但不是像这样的大字符串 – MartW 2009-10-14 12:47:02

+0

@CodeByMoonlight - 什么是源代码中的长字符串,但代码?我并不是说这是正确的方法,但它确实如此!我个人会将字符串存储为资源! – stevehipwell 2009-10-14 13:03:34

+0

我经常使用这个选项,对于可能覆盖多个屏幕的长字符串感觉不对。如前所述,资源选择更好。 – MartW 2009-10-16 09:32:18

0

我要么让它运行,要么使用string.format并将该字符串写入一行(let it run方法),而是将每个参数放在新行中,这样可以更容易阅读,或者在至少给读者一些想法,而不用详细阅读他可以期待的长串。

+0

或者,分解真正的长字符串并使用'string.Concat'来加入这些片断。这可以避免右侧的过度“+”:-) – Joey 2009-10-14 12:14:46

6

它是否必须在源文件中定义?否则,请在资源或配置文件中定义它。

5

你可以使用StringBuilder这样的:

StringBuilder str = new StringBuilder(); 
str.Append("this is my really long string. this is my long string. "); 
str.Append("this is my really long string. this is my long string. "); 
str.Append("this is my really long string. this is my long string. "); 
str.Append("this is my really long string. this is my long string. "); 
string s = str.ToString(); 

您还可以使用:文本文件,资源文件,数据库和注册表。

+0

不知道为什么这个响应被评为如此之低。它有示例代码,并且使用StringBuilder是一个很好的练习,因为在许多连接中它更高效。 – 2009-10-14 12:40:53

+0

因为在这种情况下它只是增加了不必要的复杂性。 – MartW 2009-10-14 12:45:11

+0

我不确定问题中有足够的背景来确定情况。这是应用程序启动时的一次性消息吗?或者它是一种被称为每秒100次的方法中的日志消息?在这种情况下,表现很重要。参考实际性能测量:http://blog.briandicroce.com/2008/02/04/stringbuilder-vs-string-performance-in-net/ – 2009-10-14 17:20:35

3

就我个人而言,我会从文件或XML文档中读取大的字符串。

2

对于非常长的字符串,我会将它存储在XML(或资源)中。对于在代码中有意义的场合,我使用+运算符的多行字符串连接。但是我唯一能够想到的地方是,在我的单元测试中,我的单元测试用于读取和解析XML的代码,其中我实际上试图避免使用XML文件进行测试。由于这是一个单元测试,我几乎总是想让字符串在那里进行引用。在这些情况下,我可能会将它们全部分隔到#region指令中,以便可以根据需要显示/隐藏它们。

0

如果你真的需要保留在代码中,那么@ +换行符和一个简单的函数去掉换行符。

4

如果你真的想在代码中这个长字符串,你真的不想输入end-quote-plus-begin-quote,那么你可以尝试这样的事情。

string longString = @"Some long string, 
    with multiple whitespace characters 
    (including newlines and carriage returns) 
    converted to a single space 
    by a regular expression replace."; 

longString = Regex.Replace(longString, @"\s+", " "); 
0

使用Visual Studio顶级菜单中的Project/Properties/Settings。制作scope = "Application"

在值框中,您可以输入非常长的字符串,并且作为奖励提示行被保留。然后你的代码可以参考该字符串是这样的:

string sql = Properties.Settings.Default.xxxxxxxxxxxxx;