I have several methods in an application I'm working on loaded with optional parameters, some of which are enums. Currently, in order to do that I'm writing methods with a similar type of signature:

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

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

So my first question is, is there some pitfall to this approach I haven't realized, but in time will become painfully aware of, and secondly, is there a more proper - or at least elegant solution to it?

I should say that we control the input to this method, it's used internally, so I'm not worried about someone casting in a value of -1 to gum up the works.

有帮助吗?

解决方案 2

Make sure your enum has a default value (equal to zero), that means "none" or "invalid". This would be an appropriate value for your optional parameter's default value.

This is recommended by Microsoft Code Analysis as well, CA1008: Enums should have zero value.

For example:

enum SpeakerType
{
    None = 0,
    Woofer,
    Midrange
    Tweeter
}

This way the default keyword provides a value that is sane, but doesn't unintentionally refer to something you don't want it to.


As an example, the BCL uses this same concept. The number of stop bits to use for a SerialPort is defined by the StopBits enum:

public enum StopBits
{
  None,
  One,
  Two,
  OnePointFive,
}

However the None value is invalid. In fact,

The SerialPort class throws an ArgumentOutOfRangeException exception when you set the StopBits property to None.

其他提示

I would suggest using nullable enum in this situation, like this:

public void SomeMethod(string myFirstParam = "", 
                       string mySecondParam = "", 
                       MyEnum? myThirdParam = null)
{
   if (myThirdParam.HasValue)
   {
      var enumValue = myThirdParam.Value;
      //do something with it
   }
}

and you can use it like this:

SomeMethod(myThirdParam: MyEnum.Something);

What about :

enum MyEnum {
   MISSING = -1,
   FirstValue,
   SecondValue,
   ...
}

public void SomeMethod(string myFirstParam = "", string mySecondParam = "", MyEnum myThirdParam = MISSING) {
     if (myThirdParam != MISSING)
     {
          //do something with it
     }
} 
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top