19

このコードは無効です:

private void Foo(string optionalString = string.Empty)
{
   // do foo.
}

しかし、このコードは次のとおりです。

private void Foo(string optionalString = "")
{
   // do foo.
}

なんで?string.Empty は定数ではなく読み取り専用フィールドであり、オプションのパラメーターのデフォルトはコンパイル時の定数でなければならないためです。

それで、私の質問に...(まあ、懸念)

これは私がしなければならなかったことです:

private const string emptyString = "";

private void Foo(string optionalString = emptyString)
{
   // do foo.
   if (!string.IsNullOrEmpty(optionalString))
      // etc
}

オプションの文字列パラメータをどのように処理しますか?

String.Emptyをコンパイル時の定数にできないのはなぜですか?

4

6 に答える 6

15

うーん...文字列optionalParm=""の何が問題になっていますか?なぜそれが悪いのですか?この場合、空の文字列にシンボリック定数が必要だと本当に思いますか?では、これはどうですか?

const int Zero = 0;

void SomeMethod(int optional = Zero) { }

それはあなたにはまったくばかげているように見えますか?

于 2010-08-31T05:47:33.927 に答える
6

「」の値が気に入らない場合は、default(string)を使用できます。
私はそれで遊んだ、そしてそれは許される。

private static void foo(string param = default(string)) {
    if (!string.IsNullOrEmpty(param)) // or param != default(string)
        Console.WriteLine(param);
}
于 2010-09-23T07:34:01.730 に答える
4

コード分​​析の警告 1026は、オプションのパラメーターを使用しないように指示しています。次のように、オーバーロード メソッドを使用する方が適切です。

private void Foo()
{
   Foo(string.Empty);
}
private void Foo(string optionalString)
{
   // do foo.
   if (!string.IsNullOrEmpty(optionalString))
      // etc
}
于 2016-09-29T20:36:04.607 に答える
2

それらを処理する最良の方法は次のとおりです。

private void Foo(string optionalString = "")
{
   // do foo.
}

したがって、String.Emptyを使用することはできません。誰もが「」を認識していますが、見つけoptionalString = nullStringたらどう考えたらいいのかわかりません。 他に何もない場合は、名前を付けてemptyStringください。nullではありません。

于 2010-08-31T05:48:06.620 に答える
1

私はこの質問に答えています。

Why can they not make String.Empty a compile-time constant?

これは、mscorlib.dll の String.cs のリフレクターを介した逆アセンブル コードです。

public static readonly Empty;
static String()
{
    Empty = "";
    WhitespaceChars = new char[] { 
        '\t', '\n', '\v', '\f', '\r', ' ', '\x0085', '\x00a0', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 
        ' ', ' ', ' ', ' ', '​', '\u2028', '\u2029', ' ', ''
     };
}

したがって、Windows プラットフォームでは、string.Empty は正確に "" です。しかしご存知のとおり、Martian の OS では、Empty と WhitespaceChars の定義が異なります。

于 2010-08-31T06:07:10.850 に答える
0

null、""、および空白文字を同じものとして扱い、失うことを厭わない場合は、デフォルトでnull. これは、データベースへの信頼できる接続の可能性があるため、ユーザー名とパスワードがオプションのフィールドである場合に非常に便利です。このロジックを変更して文字列を にリセットしnull、アサートとif. 重要な部分は、一貫した規則を持つことです。

private void RunSql(string serverName, string databaseName, string userName = null, string password = null)
{
    userName = Strip(userName);
    password = Strip(password);

    // The `MsTest` assert - works in both `Debug` and `Release` modes.
    Assert.AreEqual<bool>(
        userName == String.Empty,
        password == String.Empty,
        "User name and password should be either both empty or both non-empty!");
   Assert.IsFalse(String.IsNullOrWhiteSpace(serverName));
   Assert.IsFalse(String.IsNullOrWhiteSpace(databaseName));

   var cmdBuilder = new StringBuilder();
   cmdBuilder.AppendFormat("sqlcmd -E -S {0} -d {1} ", serverName, databaseName);
   if (userName.Length > 0)
   {
       cmdBuilder.AppendFormat("-U {0} -P {1} ", userName, password);
   }

   // Complete the command string.
   // Run the executable.
}

// Cannot think of a good name. Emptify? MakeNullIfEmpty?
private string Strip(string source)
{
    if (String.IsNullOrWhiteSpace(source))
    {
        return String.Empty;
    }

    return source;
}
于 2011-04-05T16:08:19.223 に答える