Нулевые параметры в С#?
После чтения в stackoverflow, чтобы в случае проверки формата DateTime вы должны использовать DateTime.TryParse. После использования некоторых выражений регулярных выражений они кажутся длинными и неприятными для покрытия большого количества форматирования.
Но TryParse требует параметр "out", и поскольку я просто хочу проверить формат проверки, мне не нужен фактический результат.
Итак, я остаюсь с переменной, которая содержит результат "out", и я ничего не делаю с ней. Есть ли способ, поэтому мне не нужно делать параметр out?
Поэтому я избавляюсь от этого предупреждения и перестаю иметь переменную, просто летающую вокруг.
Ответы
Ответ 1
Неа. Я бы обернул его каким-то способом, чтобы сохранить шум из основного потока:
bool IsValidDate(string value)
{
DateTime result;
return DateTime.TryParse(value, out result); //result is stored, but you only care about the return value of TryParse()
}
Ответ 2
В С# 7.0 (с августа 2016 года) вы можете использовать конструкцию out var, а затем просто игнорировать новый var в последующем коде.
bool success = DateTime.TryParse(value, out var result);
Если вы действительно не заботитесь о значении результата, используйте Discards:
bool success = DateTime.TryParse(value, out _);
Ответ 3
Я не предлагаю вам на самом деле это сделать, но вы можете использовать один вспомогательный класс, чтобы сделать это легко для всех параметров:
public static class OutHelper<T>
{
[ThreadStatic]
public static T Ignored;
}
Затем вы можете позвонить:
if (DateTime.TryParse(text, out OutHelper<DateTime>.Ignored))
Это ужасно, использует общедоступное изменяемое поле, и если ваше приложение также работает с каким-то вредоносным кодом, оно дает этому коду доступ к последнему значению, которое вы проанализировали... но оно должно работать:)
Ответ 4
Нет. Вы не можете избавиться от переменной, но вы также не должны получать предупреждение о компиляторе.
Передача переменной в качестве out
является "использованием" переменной. Из-за этого компилятор не выдаст предупреждение.
Ответ 5
Если вы используете .NET 3 и выше, вы всегда можете создать метод расширения?
public static bool IsValidDate(this string value)
{
DateTime date = DateTime.Null;
return DateTime.TryParse(value, out date);
}
[Отредактировано, чтобы переименовать имя метода в более подходящее]
Ответ 6
TryParse
- лучший вариант. Это просто переменная, которая теряется. Другие варианты включают использование Convert.ToDateTime()
в блоке try-catch. Но опять же это было бы неэффективно, потому что блоки try-catch должны быть тяжелыми. Следующая опция - регулярное выражение. Это лучшее решение. Я думаю, это дает вам результат мгновенно, чем по сравнению с другими.
Вы можете очень хорошо обернуть метод, как сказал Ким Грэсман...