在C#中声明一个looooong单行字符串

Declaring a looooong single line string in C#

是否有一种合适的方法来用C声明一个长的单行字符串,这样就不可能在编辑器中声明和/或查看该字符串?

我知道的选项有:

1:让它跑吧。这是很糟糕的,因为字符串会一直拖到屏幕的右侧,这使得开发者阅读消息时不得不进行烦人的滚动和阅读。

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:@+换行。这在代码中看起来很好,但在字符串中引入了换行符。此外,如果您希望它在代码中看起来漂亮,那么不仅会得到换行符,而且在字符串的每一行的开头也会得到笨拙的空格。

1
2
3
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:"" + ...这个很好用,但是打字太令人沮丧了。如果我需要在某个地方添加半行的文本,我必须更新所有类型的+,并四处移动文本。

1
2
3
4
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。基本上和上面一样,但没有加号。有相同的好处和缺点。

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


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


如果使用Visual Studio

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

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


这取决于绳子的使用方式。这里的所有答案都是有效的,但是上下文很重要。如果要记录长字符串"s",它应该被一个日志保护测试包围,例如下面的log4net示例:

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

如果要向用户显示长字符串,那么DeveloperArt的答案是最佳选择……这些应该在资源文件中。

对于其他用途(生成SQL查询字符串、写入文件[但再次考虑这些文件的资源]等),如果您要连接的不仅仅是文本,请按照Wael Dalloul的建议考虑StringBuilder,特别是如果您的字符串可能最终出现在一个函数中,而该函数在遥远的将来可能在某个日期被称为许多时间关键型应用程序中的时间(所有这些调用加起来)。例如,我在构建一个参数为变量的SQL查询时就这样做了。

除此之外,不,我不知道有什么东西既好看又容易输入(虽然换行建议是一个好主意,但它可能无法很好地翻译成diff工具、代码打印输出或代码审查工具)。这些就是休息时间。(我个人使用加号方法使行包装整洁,以便进行打印输出和代码检查)。


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


如果您真的想在代码中使用这个长字符串,并且您真的不想键入结束引号和开始引号,那么您可以尝试这样的操作。

1
2
3
4
5
6
7
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+","");

可以这样使用StringBuilder:

1
2
3
4
5
6
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();

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


我个人会从一个文件或者一个XML文档中读取一个如此大的字符串。


对于非常长的字符串,我将它存储在XML(或资源)中。对于代码中有意义的情况,我使用了与+运算符连接的多行字符串。不过,我唯一能想到的地方是在我的代码单元测试中读取和解析XML,而实际上我正试图避免使用XML文件进行测试。因为这是一个单元测试,所以我几乎总是希望在那里引用字符串。在这些情况下,我可以将它们全部隔离成一个区域指令,以便根据需要显示/隐藏它。


可以使用StringBuilder


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

在"值"框中,您可以输入非常长的字符串,并且作为奖励线源保留。然后您的代码可以像这样引用该字符串:

string sql = Properties.Settings.Default.xxxxxxxxxxxxx;


如果您真的需要将它保存在代码中,那么@+换行符和一个简单的函数来去掉换行符怎么样?


我要么让它运行,要么使用string.format将字符串写在一行中(let it run方法),但将每个参数都放在新行中,这样可以更容易地阅读,或者至少让读者知道在不详细阅读的情况下,他可以在长字符串中看到什么。