.net - Los métodos sobrecargados dan advertencia de "El método con el parámetro opcional está oculto por sobrecarga" en Resharper
overloading string.format (1)
Por lo que veo, hay dos preguntas en tu publicación.
En primer lugar , si cree que sus métodos podrían ser renombrados a algo más obvio, adelante, eso mejorará su código en muchos aspectos (legibilidad, facilidad de uso, etc.) y de todos modos deberían describir lo más cerca posible de lo que hacen.
Segundo , sobre la advertencia de Resharper:
La recursividad mediante el uso de funciones sobrecargadas no implica ni conduce a la advertencia que está viendo.
Probablemente sepa que la función sobrecargada se usa más comúnmente cuando los parámetros de una función tienen diferentes tipos, pero la función hace lo mismo, como por ejemplo:
private static void Print(int i) {...}
private static void Print(bool b) {...}
Sin embargo, si una función está sobrecargada y si esa sobrecarga tiene exactamente el mismo tipo de parámetros así como parámetros opcionales , lo más probable es que tenga un problema de diseño.
Explicacion basica
Si tienes algo como esto:
private static void Print(string message) {...}
private static void Print(string message, string messageDelimiter = "===/n") {...}
Cuando llamará a la función Imprimir desde su clase, ya que ambas funciones tendrán el mismo aspecto cuando las llame: Print("my message");
el que tiene el parámetro opcional está oculto.
Por lo tanto, simplemente podría fusionarlos así:
private static void Print(string message, string messageDelimiter = "===/n") {...}
Además
También es posible que desee hacer algo más inteligente, como darle acceso al usuario a una función pública y restringir la que tiene el parámetro opcional así:
public static void Print(string message) {...} //< As you can see this one is public
private static void Print(string message, string messageDelimiter = "===/n") {...}
Incluso si ese es el caso, encontrará el mismo problema.
En mi opinión, una buena regla general es hacerse algunas preguntas:
- ¿El parámetro opcional realmente tiene sentido donde está?
- ¿La función realmente necesita tener el mismo nombre?
- ¿El parámetro debería ser realmente opcional?
Si responde sí a todos ellos, podría estar "bien" ignorar el comentario de Resharper y dejar su código tal como está.
Tengo algunas aplicaciones de C # que hacen el registro, y el método de salida tiene una sobrecarga para aceptar el mensaje y un StreamWriter, y otra sobrecarga con un parámetro adicional para una matriz de parámetros. Un ejemplo de las firmas del método es:
private static void Output(string message, StreamWriter writer, params object[] args)
{..}
private static void Output(string message, StreamWriter writer)
{..}
La pregunta concierne a Resharper que da la siguiente advertencia para estos métodos: "El método con parámetro opcional está oculto por sobrecarga ".
La advertencia es engañosa porque llamo a la sobrecarga 2-param desde dentro de la sobrecarga 3 param y no produce una llamada recursiva, por lo que la sobrecarga no está oculta.
Hice una investigación en el sitio de Resharper y se han abierto algunos tickets sobre este problema que se han cerrado porque "no se solucionarán".
Me parece que este es un caso de uso válido, ya que el tiempo de ejecución sabe a qué sobrecarga llamar. También hay ejemplos en el marco .NET donde usan tales sobrecargas.
Por ejemplo, StreamWriter.WriteLine()
tiene sobrecargas para escribir el valor y también los Format params
.
¿Es este un argumento válido, o mis métodos deberían ser renombrados a algo como "OutputFormat" ya que detrás de escena están usando string.Format para construir una cadena con los parámetros especificados?