c# - valor - Usando una enumeración como parámetro opcional
que es un enum en java (3)
Asegúrese de que su enum
tenga un valor predeterminado (igual a cero), que significa "ninguno" o "no válido". Este sería un valor apropiado para el valor predeterminado de su parámetro opcional.
Esto también es recomendado por Microsoft Code Analysis, CA1008: Enums debería tener valor cero .
Por ejemplo:
enum SpeakerType
{
None = 0,
Woofer,
Midrange
Tweeter
}
De esta manera, la palabra clave default
proporciona un valor que es sano, pero que no se refiere involuntariamente a algo que no desea.
Como ejemplo, el BCL utiliza este mismo concepto. El número de bits de parada a usar para un SerialPort
se define mediante la enumeración de StopBits
:
public enum StopBits
{
None,
One,
Two,
OnePointFive,
}
Sin embargo, el valor None
no es válido. De hecho,
La clase
SerialPort
lanza una excepciónArgumentOutOfRangeException
cuando establece la propiedadStopBits
enNone
.
Tengo varios métodos en una aplicación en la que estoy trabajando cargada con parámetros opcionales, algunos de los cuales son enumerados. Actualmente, para hacer eso estoy escribiendo métodos con un tipo de firma similar:
public void SomeMethod(string myFirstParam = "", string mySecondParam = "", MyEnum myThirdParam = (MyEnum )(-1)){
if (myThirdParam != (MyEnum ) (-1))
{
//do something with it
}
}
Entonces, mi primera pregunta es, ¿hay algún escollo en este enfoque que no he comprendido, pero con el tiempo será dolorosamente consciente, y en segundo lugar, hay una solución más adecuada, o al menos elegante?
Debo decir que controlamos la entrada a este método, se usa internamente, por lo que no me preocupa que alguien agregue un valor de -1 para pegar las obras.
Qué pasa :
enum MyEnum {
MISSING = -1,
FirstValue,
SecondValue,
...
}
public void SomeMethod(string myFirstParam = "", string mySecondParam = "", MyEnum myThirdParam = MISSING) {
if (myThirdParam != MISSING)
{
//do something with it
}
}
Sugeriría usar enumeración nullable en esta situación, como esta:
public void SomeMethod(string myFirstParam = "",
string mySecondParam = "",
MyEnum? myThirdParam = null)
{
if (myThirdParam.HasValue)
{
var enumValue = myThirdParam.Value;
//do something with it
}
}
y puedes usarlo así:
SomeMethod(myThirdParam: MyEnum.Something);