Использование перечисления в качестве необязательного параметра
У меня есть несколько методов в приложении, над которым я работаю, с дополнительными параметрами, некоторые из которых перечислены. В настоящее время для этого я пишу методы с похожим типом подписи:
public void SomeMethod(string myFirstParam = "", string mySecondParam = "", MyEnum myThirdParam = (MyEnum )(-1)){
if (myThirdParam != (MyEnum ) (-1))
{
//do something with it
}
}
Итак, мой первый вопрос: есть ли какая-то ошибка для этого подхода, который я не осознал, но со временем станет мучительно осознавать, а во-вторых, есть ли более правильное или, по крайней мере, элегантное решение?
Я должен сказать, что мы контролируем ввод этого метода, он используется внутри, поэтому я не беспокоюсь о том, что кто-то забрасывает значение -1, чтобы придумать работу.
Ответы
Ответ 1
Убедитесь, что ваш enum
имеет значение по умолчанию (равное нулю), что означает "none" или "invalid". Это будет подходящим значением для вашего необязательного значения по умолчанию параметра.
Это также рекомендуется с помощью анализа кода Microsoft, CA1008: перечисления должны иметь нулевое значение.
Например:
enum SpeakerType
{
None = 0,
Woofer,
Midrange
Tweeter
}
Таким образом, ключевое слово default
обеспечивает значение, которое является нормальным, но не приводит к непреднамеренному обращению к тому, что вы не хотите к.
В качестве примера BCL использует эту же концепцию. Количество стоповых бит для использования SerialPort
определяется StopBits
перечисление:
public enum StopBits
{
None,
One,
Two,
OnePointFive,
}
Однако значение None
недопустимо. Фактически,
Класс SerialPort
генерирует исключение ArgumentOutOfRangeException
, если для свойства StopBits
установлено значение None
.
Ответ 2
Я бы предложил использовать nullable enum в этой ситуации, например:
public void SomeMethod(string myFirstParam = "",
string mySecondParam = "",
MyEnum? myThirdParam = null)
{
if (myThirdParam.HasValue)
{
var enumValue = myThirdParam.Value;
//do something with it
}
}
и вы можете использовать его следующим образом:
SomeMethod(myThirdParam: MyEnum.Something);
Ответ 3
Как насчет:
enum MyEnum {
MISSING = -1,
FirstValue,
SecondValue,
...
}
public void SomeMethod(string myFirstParam = "", string mySecondParam = "", MyEnum myThirdParam = MISSING) {
if (myThirdParam != MISSING)
{
//do something with it
}
}