【问题标题】:Declaring a looooong single line string in C#在 C# 中声明一个 looooong 单行字符串
【发布时间】:2010-12-06 15:43:48
【问题描述】:

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

真的没有办法做好吗?

【问题讨论】:

    标签: c# string coding-style code-formatting


    【解决方案1】:

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

    【讨论】:

    • 我喜欢更改我的 VS 配色方案,以便字符串以某种可怕的颜色显示。总是提醒我有不好的事情正在发生。
    • 不好的做法是的,但在遗留软件中并不总是可以修复(项目经理没有看到光明)。
    • @Stevo3000:我相信问题作者能够解决它。这就是他寻求建议的原因。
    • +1 虽然它可能并不总是一个坏习惯......想想那些仅供开发人员使用并且用户永远不会看到的字符串(例如用于诊断目的的字符串)。将它们作为资源维护的(努力)开销可能不值得。
    • -1 。它没有回答问题,而且暗示了一种误导性的“最佳”做法,这是有问题的(例如,参见 SDX2000 的评论)。
    【解决方案2】:

    如果您真的想要在代码中使用这个长字符串,并且您真的不想输入 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+", " ");
    

    【讨论】:

      【解决方案3】:

      如果使用 Visual Studio

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

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

      【讨论】:

      • 我喜欢代码选项,但不喜欢这样的大字符串
      • @CodeByMoonlight - 除了代码之外,源代码中的长字符串是什么?我并不是说这是正确的方法,但它确实做到了它在锡上所说的!我个人会将字符串存储为资源!
      • 我经常使用这个选项,对于可能覆盖多个屏幕的长字符串感觉不对。如前所述,资源选项更好。
      【解决方案4】:

      这取决于字符串将如何被使用。这里的所有答案都是有效的,但上下文很重要。如果要记录长字符串“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 查询时执行此操作,其中参数是变量。

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

      【讨论】:

      • 字符串文字的连接由 C# 编译器处理,因此在运行时使用声明为"x"+"y"+"Z"+...的字符串的开销为零
      • 啊,@280Z28 当然是正确的!我添加了一些关于何时使用 StringBuilder 方法的说明(当您将变量与您的 ltierals 混合时)。
      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

        • 不知道为什么这个回复被评为这么低。它有示例代码,并且使用 StringBuilder 是一个很好的做法,因为在许多连接中,它更有效。
        • 因为在这种情况下它只会增加不必要的复杂性。
        • 我不确定问题中有足够的上下文来确定情况。这是应用程序启动时的一次性消息吗?或者它是每秒调用 100 次的方法中的日志消息?在这种情况下,性能很重要。参考实际性能测量:blog.briandicroce.com/2008/02/04/…
        • @Ogre:字符串 literals 的连接由 C# 编译器处理。使用StringBuilder 实际上会比使用"x"+"y" 慢,后者的运行时开销为零。
        • 像这样使用 StringBuilder 有点抢先式微优化的味道。 blog.codinghorror.com/…
        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

          你可以使用 StringBuilder

          【讨论】:

            【解决方案9】:

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

            【讨论】:

              【解决方案10】:

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

              【讨论】:

              • 或者,分解很长的字符串并使用string.Concat 加入片段。这避免了右侧过多的+-ness :-)
              【解决方案11】:

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

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

              string sql = Properties.Settings.Default.xxxxxxxxxxxxx;

              【讨论】:

                猜你喜欢
                • 2012-09-14
                • 1970-01-01
                • 1970-01-01
                • 2010-09-07
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-04-26
                相关资源
                最近更新 更多