sobrecarga pasar pasaje parametros opcionales objetos metodos metodo mandar llamar firma definicion como c# overloading

pasaje - pasar objetos como parametros en c#



¿Sobrecargar es la única forma de tener argumentos de funciones por defecto en C#? (8)

¿Es cierto que la única forma de manejar los argumentos de las funciones predeterminadas es a través de la sobrecarga de funciones?

Por ejemplo, en PHP puedo hacer esto:

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

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

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

Ejemplo levantado de aquí

Editar

Hizo que el ejemplo C # se convirtiera en C # real (gracias a Blair Conrad)


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


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


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


Sí.

O currying.

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


Solo para satisfacer algo de curiosidad:

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

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

Proceso nulo (Empleado empleado, bono bool = falso)

Este método se puede llamar con:

a.Proceso (empleado, verdadero);

o

a.Proceso (empleado);

en el segundo caso, el bonus de parámetro se establece en falso.

C # no tiene esta característica.

Una razón por la 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.process (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 hubiera escrito ''falso'' como el segundo parámetro. No hay forma de cambiar ese valor predeterminado sin obligar al usuario de la clase a recompilar, lo cual es desafortunado.

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 para un compilador tomar algo como la definición de C ++ y producir las sobrecargas, pero hay algunos problemas con ese enfoque.

El primero es que la correlación entre el código que el usuario escribe y el código que genera el compilador es menos obvio. Por lo general, tratamos de limitar la magia cuando es posible, ya que hace que sea más difícil para los programadores. El segundo problema tiene que ver con cosas como XML doc comments e intellisense. El compilador debería tener reglas especiales sobre cómo generar comentarios de documentación para los métodos sobrecargados, y intellisense debería tener inteligencia para colapsar los métodos sobrecargados en un único método.

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



¿esto no hace el trabajo?

void foo(int x):this(x, 0){} void foo(int x, int y){ // code here }


En cuanto al extracto de c # faq :

La mayoría de los problemas enumerados se resolvieron para VB.Net (específicamente los problemas de Intellisense y xml comments), lo que significa que son realmente pistas falsas: hay un código disponible para el equipo de C # que resolverá el problema.

Otra razón tiene que ver con forzar a un usuario de una clase a que vuelva a compilar, pero eso también es una pizca de esperanza. Si cambia un valor predeterminado en su clase de infraestructura y el usuario no tiene que volver a compilar, se arriesga a que el usuario no sepa que el valor predeterminado cambió. Ahora tiene un posible error 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 tan mala. Por supuesto, esto también presupone una implementación específica de la función, pero es la implementación sugerida en la pregunta frecuente.

Por lo tanto, debe sopesar el motivo restante ("intentar limitar la magia") frente al hecho (que reconocen) de que escribir las sobrecargas es "un poco menos conveniente". Personalmente, digo poner la función y dejar que el programador decida si usarla o no.