40

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

我知道的选项是:

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:@+换行符。这在代码中看起来不错,但在字符串中引入了换行符。此外,如果您希望它在代码中看起来不错,您不仅会得到换行符,而且还会在字符串的每一行的开头出现尴尬的空格。

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:。与上面基本相同,但没有加号。具有相同的优点和缺点。

真的没有办法做好这件事吗?

4

11 回答 11

64

有一种方法。把你很长的字符串放在资源中。您甚至可以在其中放置很长的文本,因为它是文本应该在的位置。将它们直接放在代码中是一种非常糟糕的做法。

于 2009-10-14T12:07:13.567 回答
12

如果您真的想要代码中的这个长字符串,并且您真的不想输入 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+", " ");
于 2009-10-21T02:58:18.890 回答
10

如果使用 Visual Studio

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

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

于 2009-10-14T12:09:31.720 回答
8

您可以像这样使用 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();

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

于 2009-10-14T12:12:50.423 回答
8

这取决于字符串将如何被使用。这里的所有答案都是有效的,但上下文很重要。如果要记录长字符串“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 ,那么Developer Art的答案是最佳选择……那些应该在资源文件中。

对于其他用途(生成 SQL 查询字符串、写入文件 [但再次考虑这些资源] 等),如果您连接的不仅仅是文字,请考虑 StringBuilder,如Wael Dalloul建议的那样,特别是如果您的字符串可能会缠绕在一个函数中,该函数可能在遥远的将来的某个日期在时间关键型应用程序中被多次调用(所有这些调用加起来)。例如,我在构建 SQL 查询时执行此操作,其中参数是变量。

除此之外,不,我不知道任何看起来漂亮且易于输入的东西(尽管自动换行建议是个好主意,但它可能无法很好地转化为差异工具、代码打印输出或代码审查工具)。这些是休息时间。(我个人使用加号方法使换行符整洁,以便我们的打印输出和代码审查)。

于 2009-10-21T02:44:49.357 回答
6

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

于 2009-10-14T12:12:33.883 回答
3

就个人而言,我会从一个文件中读取一个那么大的字符串,也许是一个 XML 文档。

于 2009-10-14T12:26:24.033 回答
2

你可以使用 StringBuilder

于 2009-10-14T12:08:40.663 回答
2

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

于 2009-10-14T12:40:15.523 回答
0

我要么让它运行,要么使用 string.format 并将字符串写入一行(让它运行方法),但将每个参数放在新行中,这样要么更容易阅读,要么至少给读者知道他在长字符串中可以期待什么,而无需详细阅读。

于 2009-10-14T12:11:52.950 回答
0

使用Project / Properties / SettingsVisual Studio 顶部菜单中的 。使scope = "Application".

在“值”框中,您可以输入很长的字符串,并保留换行作为奖励。然后您的代码可以像这样引用该字符串:

string sql = Properties.Settings.Default.xxxxxxxxxxxxx;

于 2018-03-09T14:36:02.913 回答