¿La sobrecarga es la única forma de tener argumentos de función predeterminados en C#?

StackOverflow https://stackoverflow.com/questions/40090

  •  09-06-2019
  •  | 
  •  

Pregunta

¿Es cierto que la única forma de manejar los argumentos de las funciones predeterminadas es mediante la sobrecarga de funciones?

Por ejemplo, en PHP puedo hacer esto:

function foo($x, $y=0)
{
}

¿Sería esta la mejor manera de manejarlo en C#?

void foo(int x)
{
  foo(x, 0);
}

void foo(int x, int y)
{
}

Ejemplo sacado de aquí

Editar

Convirtió el ejemplo de C# en C# real (Gracias Blair Conrad)

¿Fue útil?

Solución

Si, eso sería lo mejor, excepto que omitirías el $s en los nombres de los parámetros, como otros han señalado.Para aquellos interesados ​​en la razón detrás de la falta de valores de parámetros predeterminados, consulte la explicación de @Giovanni Galbo.

Otros consejos

Sólo para satisfacer alguna curiosidad:

De ¿Por qué C# no admite parámetros predeterminados?:

En lenguajes como C++, se puede incluir un valor predeterminado como parte de la declaración del método:

Proceso anulado (Empleado empleado, bonificación bool = falso)

Este método se puede llamar con:

a.Proceso(empleado, verdadero);

o

a.Proceso(empleado);

en el segundo caso, la bonificación del parámetro se establece en falso.

C# no tiene esta característica.

Una de las razones por las que no tenemos esta función está relacionada con una implementación específica de la función.En el mundo C++, cuando el usuario escribe:

a.Proceso(empleado);

el compilador genera

a.proceso(empleado,falso);

En otras palabras, el compilador toma el valor predeterminado que se especifica en el prototipo del método y lo coloca en la llamada al método; es como si el usuario escribiera "falso" como segundo parámetro.No hay forma de cambiar ese valor predeterminado sin obligar al usuario de la clase a volver a compilar, lo cual es lamentable.

El modelo de sobrecarga funciona mejor a este respecto.El autor del marco simplemente define dos métodos separados, y el de un solo parámetro llama al método de dos parámetros.Esto mantiene el valor predeterminado en el marco, donde se puede modificar si es necesario.

Sería posible que un compilador tomara algo como la definición de C++ y produjera las sobrecargas, pero hay algunos problemas con ese enfoque.

La primera es que la correlación entre el código que escribe el usuario y el código que genera el compilador es menos obvia.Generalmente tratamos de limitar la magia cuando es posible, ya que se lo pone más difícil a los programadores.El segundo problema tiene que ver con cosas como comentarios de documentos XML e intellisense.El compilador tendría que tener reglas especiales sobre cómo genera comentarios de documentos para los métodos sobrecargados, y Intellisense necesitaría tener inteligencia para colapsar los métodos sobrecargados en un solo método.

Escribir sobrecargado es un poco menos conveniente, pero creemos que es una solución aceptable.

Con respecto a extracto de las preguntas frecuentes de c#:

La mayoría de los problemas enumerados allí se resolvieron para VB.Net (específicamente los problemas de comentarios intellisense y xml), lo que significa que en realidad son pistas falsas. hay código disponible para el equipo de C# que resolverá el problema.

Otra razón tiene que ver con obligar a un usuario de una clase a volver a compilar, pero eso también es una pista falsa.Si usted cambiar un valor predeterminado en su clase de marco y el usuario lo hace no Tienes que recompilar, arriesgas al usuario. sin saber que el valor predeterminado cambió. Ahora tiene un error potencial en el código que no aparece hasta el tiempo de ejecución.En otras palabras, la alternativa de sobrecargar la función es al menos igual de mala.Por supuesto, esto también supone una implementación específica de la característica, pero es la implementación sugerida en las preguntas frecuentes.

Por lo tanto, hay que sopesar la razón restante ("intentar limitar la magia") versus el hecho (que ellos reconocen) de que escribir las sobrecargas es "un poco menos conveniente".Personalmente, digo que incluya la función y deje que el programador decida si la usa o no.

Los argumentos predeterminados son parte de C++, pero a partir de C# 3.5, los argumentos predeterminados todavía no son compatibles; tendrá que sobrecargarlos.Han estado disponibles en VB.Net desde 1.0.

Sí.

O curry.

O abstraerse en una clase y usar valores predeterminados allí.

No, AFAIK C# no admite la anulación y sí, esa es la forma recomendada de lograr el mismo efecto.

Como se señaló, esto no está disponible actualmente en C#; sin embargo, estará presente en C# 4.0, como lo explica Sam Ng en su blog:

http://blogs.msdn.com/samng/archive/2009/02/03/named-arguments-optional-arguments-and-default-values.aspx

¿Esto no funciona?

void foo(int x):this(x, 0){}

void foo(int x, int y){
 // code here
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top