39

検索用語を思いつくのに苦労していた、ちょっと変わった質問です。プログラムに複数行の文字列リテラルがある場合、文字列リテラルに不要な空白を追加せずにコードのインデントの一貫性を保つ方法はありますか?

元:

if (true)
{
    if (!false)
    {
        //Some indented code;
        stringLiteral = string.format(
@"This is a really long string literal
I don't want it to have whitespace at 
the beginning of each line, so I have
to break the indentation of my program
I also have vars here 
{0}
{1}
{2}",
var1, var2, var3);
    }
}

おそらく私のOCDの話ですが、文字列に不要な空白を追加したり、行ごとに作成したりせずにプログラムのインデントを維持する方法はありますか(実際の文字列は20〜行の超長いstring.formatです内部に12個の変数がある)?

4

8 に答える 8

11

別の静的クラスまたはリソースに完全に抽象化します。

public static class MyStringResources
{
    public static readonly string StringLiteral = 
@"This {0} a really long string literal
I don't want {1} to have {2} at 
the beginning of each line, so I have
to break the indentation  of my program";

}

次のような使い方で:

stringLiteral = String.Format(MyStringResources.StringLiteral, var1, var2, var3);

さらに良いことに、このようにして、予想される変数の数を必要とする素敵な関数を作成できます。

public static class MyStringLiteralBuilder
{
    private static readonly string StringLiteral = 
@"This {0} a really long string literal
I don't want {1} to have {2} at 
the beginning of each line, so I have
to break the indentation  of my program";

    public static string Build(object var1, object var2, object var3)
    {
        return String.Format(MyStringResources.StringLiteral, var1, var2, var3);
    }
}

そうすれば、誤って変数を見逃すことはありません (そして、数値やブール値などに強くタイプすることさえあります)。

stringLiteral = MyStringLiteralBuilder.Build(var1, var2, var3);
stringLiteral = MyStringLiteralBuilder.Build(var1, var2); //compiler error!

もちろん、この時点で、これらのビルダーを使用してほとんど何でも行うことができます。プログラムにある特別な大きな「stringLiteral」ごとに新しいビルダーを作成します。たぶん、それらを持つ代わりにstatic、キープロパティを取得/設定できるインスタンスにすることができます。その後、それらに素敵な名前を付けることもできます:

public class InfoCardSummary
{
    public string Name { get; set; }
    public double Age { get; set; }
    public string Occupation { get; set; }

    private static readonly string FormattingString = 
@"This person named {0} is a pretty
sweet programmer. Even though they're only
{1}, Acme company is thinking of hiring
them as a {2}.";

    public string Output()
    {
        return String.Format(FormattingString, Name, Age, Occupation);
    }
}

var info = new InfoCardSummary { Name = "Kevin DiTraglia", Age = 900, Occupation = "Professional Kite Flier" };
output = info.Output();
于 2013-06-25T21:35:49.667 に答える
3
if (true)
{
    if (!false)
    {
        //Some indented code;
        stringLiteral = string.format(
                    "This is a really long string literal. " +
                    "I don't want it to have whitespace at " +
                    "the beginning of each line, so I have " +
                    "to break the indentation of my program " +
                    "I also have vars here: " +
                    "{0} " +
                    "{1} " +
                    "{2}",
                  var1, var2, var3);
          // OR, with lineskips:
        stringLiteral = string.format(
                    "This is a really long string literal\r\n" +
                    "I don't want it to have whitespace at \r\n" +
                    "the beginning of each line, so I have\r\n" +
                    "to break the indentation of my program\r\n"
                    "I also have vars here\r\n" +
                    "{0}\r\n" +
                    "{1}\r\n" +
                    "{2}\r\n",
                  var1, var2, var3);
    }
}

美しくはありませんが、機能します。

于 2013-06-25T21:28:20.760 に答える
3

別のファイルで文字列定数を定義し、コードで識別子を使用します。文字列を翻訳したり、コンプライアンスのためにレビューしたりする必要がある場合は、とにかくすべての文字列を 1 か所にまとめておくことをお勧めします。

于 2013-06-25T21:31:39.533 に答える
1

C# 言語の文法では、次の 2 つの方法で文字列リテラルを指定できます。

  • ソース ファイルの行にまたがる可能性のあるヒアドキュメント/文字列 ( @"...")、または
  • 通常の文字列リテラル ( "...")。そうでない場合もあります。

必要な効果を得るためのその他の手段:

  1. 文字列をリソース ファイルに入れます。これにより、今後のローカリゼーションが容易になります。

  2. それらを組み込み (ファイル) リソースとしてアセンブリに追加します。

別の方法として、見栄えを良くしようとする他の回答の流れの中で:

static readonly string MultilineLiteral = string.Join( Environment.NewLine , new string[]{
                                          @"line 1" ,
                                           "line 2" ,
                                          @"line 3" ,
                                          . . .
                                          "line n" ,
                                          }) ;
于 2013-06-25T21:40:36.223 に答える
-2

私もこの問題に遭遇しました。

\n場合によっては、 (または\r\ndos/windows の場合)全体を 1 行にまとめます。

場合によっては、醜いコードのフォーマットを無視することもあります。

別の場所にテキストを配置する場合もあります。問題の文字列に応じて、c# では #define があるか、別のファイルまたはデータベースにあると思います。あなたはまだ変数を置き換える必要があります-c#ではstring.Formatを使用していると思いますか?

これが解決策を開始するのに十分であることを願っています。

于 2013-06-25T21:32:17.590 に答える