C # 4.0 - как обрабатывать необязательные строковые параметры - PullRequest
16 голосов
/ 31 августа 2010

Этот код недействителен:

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 aконстанта времени компиляции?

Ответы [ 6 ]

11 голосов
/ 31 августа 2010

Ммм ... что опять не так со строкой optionParm = ""? Почему это плохо? Вы действительно думаете, что вам нужна символическая константа для пустой строки в этом случае? Как тогда?

const int Zero = 0;

void SomeMethod(int optional = Zero) { }

Вам это кажется глупым?

5 голосов
/ 23 сентября 2010

если вам не нравится значение "", вы можете использовать значение по умолчанию (строка).
Я играл с ним, и это разрешено.

private static void foo(string param = default(string)) {
    if (!string.IsNullOrEmpty(param)) // or param != default(string)
        Console.WriteLine(param);
}
2 голосов
/ 29 сентября 2016

Предупреждение анализа кода 1026 говорит, что не следует использовать дополнительные параметры.Лучше использовать методы перегрузки, например:

private void Foo()
{
   Foo(string.Empty);
}
private void Foo(string optionalString)
{
   // do foo.
   if (!string.IsNullOrEmpty(optionalString))
      // etc
}
2 голосов
/ 31 августа 2010

Лучший способ справиться с ними:

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

Так что вы не можете использовать String.Empty.Все признают "", но если бы я нашел optionalString = nullString, я не был бы уверен, что думать. Если ничего другого, назовите вещь emptyString - она ​​не равна нулю!

0 голосов
/ 05 апреля 2011

Если вы готовы играть проигрыш и обрабатывать символы null, "" и пробелы одинаковыми, то по умолчанию вы можете использовать null. Это становится очень удобным, когда имя пользователя и пароль являются необязательными полями из-за возможности надежного подключения к БД. Вы можете изменить эту логику, чтобы сбросить строки на null и, таким образом, изменить assert и 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;
}
0 голосов
/ 31 августа 2010

Я отвечаю на этот вопрос.

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

Вот код дизассемблирования с помощью Reflector of String.cs в mscorlib.dll

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

Таким образом, в платформе Windows, string.Empty в точности "". Но знаете ли вы, у марсиан есть разные определения для Empty и WhitespaceChars в их ОС.

...