Подтвердить что ты не робот

Использование перечисления в качестве необязательного параметра

У меня есть несколько методов в приложении, над которым я работаю, с дополнительными параметрами, некоторые из которых перечислены. В настоящее время для этого я пишу методы с похожим типом подписи:

public void SomeMethod(string myFirstParam = "", string mySecondParam = "", MyEnum myThirdParam = (MyEnum )(-1)){

     if (myThirdParam != (MyEnum ) (-1))
     {
          //do something with it
     }
}

Итак, мой первый вопрос: есть ли какая-то ошибка для этого подхода, который я не осознал, но со временем станет мучительно осознавать, а во-вторых, есть ли более правильное или, по крайней мере, элегантное решение?

Я должен сказать, что мы контролируем ввод этого метода, он используется внутри, поэтому я не беспокоюсь о том, что кто-то забрасывает значение -1, чтобы придумать работу.

4b9b3361

Ответ 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
     }
}