Nota: Esta pregunta se hizo en un momento en que C # aún no admitía parámetros opcionales (es decir, antes de C # 4).
Estamos creando una API web que se genera mediante programación a partir de una clase C #. La clase tiene un método GetFooBar(int a, int b)
y la API tiene un método que GetFooBar
toma parámetros de consulta como &a=foo &b=bar
.
Las clases deben admitir parámetros opcionales, que no se admiten en C #, el lenguaje. ¿Cuál es el mejor enfoque?
c#
optional-parameters
Kalid
fuente
fuente
Respuestas:
Sorprendido, nadie mencionó los parámetros opcionales de C # 4.0 que funcionan así:
Editar: Sé que en el momento en que se hizo la pregunta, C # 4.0 no existía. Pero esta pregunta todavía ocupa el puesto número 1 en Google por "argumentos opcionales C #", así que pensé: esta respuesta vale la pena estar aquí. Lo siento.
fuente
Otra opción es usar la palabra clave params
Llamado como ...
fuente
public void log (params object[] args){ StringBuilder sb = new StringBuilder(); for (int i = 0; i < args.Length; i++){ sb.Append("{"); sb.Append(i.ToString()); sb.Append("}"); sb.Append(" "); } String.Format(sb.ToString(),args).Dump(); }
Llamada de muestra:log("...Done,",(watch.ElapsedMilliseconds/1000).ToString(),"s");
En C #, normalmente usaría múltiples formas del método:
ACTUALIZACIÓN: Esto mencionado anteriormente fue la forma en que hice valores predeterminados con C # 2.0. Los proyectos en los que estoy trabajando ahora usan C # 4.0, que ahora admite directamente parámetros opcionales. Aquí hay un ejemplo que acabo de usar en mi propio código:
fuente
De este sitio:
http://www.tek-tips.com/viewthread.cfm?qid=1500861&page=1
C # permite el uso del atributo [Opcional] (de VB, aunque no es funcional en C #). Entonces puedes tener un método como este:
En nuestro contenedor API, detectamos parámetros opcionales (ParameterInfo p.IsOptional) y establecemos un valor predeterminado. El objetivo es marcar los parámetros como opcionales sin recurrir a kludges como tener "opcional" en el nombre del parámetro.
fuente
Podría usar el método de sobrecarga ...
Depende de las firmas del método, en el ejemplo que proporcioné falta el método único "int b" porque tendría la misma firma que el método "int a".
Puede usar tipos anulables ...
Luego puede verificar, utilizando a.HasValue, para ver si se ha establecido un parámetro.
Otra opción sería utilizar un parámetro 'params'.
Si quisieras usar parámetros con nombre, necesitarías crear un tipo para manejarlos, aunque creo que ya hay algo así para las aplicaciones web.
fuente
Puede usar parámetros opcionales en C # 4.0 sin preocupaciones. Si tenemos un método como:
cuando llama al método, puede omitir parámetros como este:
C # 4.0 implementa una función llamada "parámetros con nombre", en realidad puede pasar los parámetros por sus nombres y, por supuesto, puede pasar los parámetros en el orden que desee :)
fuente
Hola mundo opcional
Si desea que el tiempo de ejecución proporcione un valor de parámetro predeterminado, debe usar la reflexión para realizar la llamada. No es tan bueno como las otras sugerencias para esta pregunta, pero es compatible con VB.NET.
fuente
Una manera fácil que le permite omitir cualquier parámetro en cualquier posición es aprovechar los tipos anulables de la siguiente manera:
Las cadenas ya son tipos anulables, por lo que no necesitan el ? .
Una vez que tenga este método, las siguientes llamadas son todas válidas :
Cuando define un método de esa manera, tiene la libertad de establecer solo los parámetros que desea nombrándolos . Consulte el siguiente enlace para obtener más información sobre parámetros con nombre y opcionales:
Argumentos nombrados y opcionales (Guía de programación de C #) @ MSDN
fuente
Estoy de acuerdo con stephenbayer. Pero dado que es un servicio web, es más fácil para el usuario final usar solo una forma del método web, que usar múltiples versiones del mismo método. Creo que en esta situación, los tipos anulables son perfectos para parámetros opcionales.
fuente
Los parámetros opcionales son para los métodos. si necesita argumentos opcionales para una clase y usted es:
usando c # 4.0: use argumentos opcionales en el constructor de la clase, una solución que prefiero, ya que está más cerca de lo que se hace con los métodos, por lo que es más fácil de recordar. Aquí hay un ejemplo:
usando versiones de c # anteriores a c # 4.0: debe usar el encadenamiento de constructor (usando: esta palabra clave), donde los constructores más simples conducen a un "constructor maestro". ejemplo:
fuente
La forma típica en que esto se maneja en C # como Stephen mencionó es sobrecargar el método. Al crear múltiples versiones del método con diferentes parámetros, efectivamente crea parámetros opcionales. En los formularios con menos parámetros, normalmente llamaría a la forma del método con todos los parámetros configurando sus valores predeterminados en la llamada a ese método.
fuente
Puedes sobrecargar tu método. Un método contiene un parámetro
GetFooBar(int a)
y el otro contiene ambos parámetros,GetFooBar(int a, int b)
fuente
Usar sobrecargas o usar C # 4.0 o superior
fuente
Para un mayor número de parámetros opcionales, se puede usar un solo parámetro de Diccionario con el método ContainsKey. Me gusta este enfoque porque me permite pasar una Lista o una T individualmente sin tener que crear otro método completo (bueno si los parámetros se van a usar como filtros, por ejemplo).
Ejemplo (se pasaría un nuevo diccionario <string, Object> () si no se desean parámetros opcionales):
fuente
En lugar de los parámetros predeterminados, ¿por qué no simplemente construir una clase de diccionario a partir de la cadena de consulta aprobada? Una implementación que es casi idéntica a la forma en que los formularios asp.net funcionan con cadenas de consulta.
es decir, Request.QueryString ["a"]
Esto desacoplará la clase de hoja del código de fábrica / repetitivo.
También es posible que desee consultar los servicios web con ASP.NET . Los servicios web son una API web generada automáticamente a través de atributos en clases de C #.
fuente
Llegué un poco tarde a la fiesta, pero estaba buscando la respuesta a esta pregunta y finalmente descubrí otra forma de hacerlo. Declare que los tipos de datos para los argumentos opcionales de su método web son de tipo XmlNode. Si se omite la arg opcional, se establecerá en nulo, y si está presente, puede obtener su valor de cadena llamando a arg.Value, es decir,
Lo que también es decente acerca de este enfoque es que la página de inicio generada por .NET para ws todavía muestra la lista de argumentos (aunque se pierden los prácticos cuadros de entrada de texto para las pruebas).
fuente
Tengo un servicio web para escribir que toma 7 parámetros. Cada uno es un atributo de consulta opcional para una instrucción sql envuelta por este servicio web. Entonces, me vienen a la mente dos soluciones alternativas a los parámetros no opcionales ... ambos bastante pobres:
método1 (param1, param2, param 3, param 4, param 5, param 6, param7) método1 (param1, param2, param3, param 4, param5, param 6) método 1 (param1, param2, param3, param4, param5, param7 ) ... comienza a ver la imagen. De esta manera se encuentra la locura. Demasiadas combinaciones.
Ahora, para una forma más simple que parece incómoda pero que debería funcionar: método1 (param1, bool useParam1, param2, bool useParam2, etc.)
Esa es una llamada al método, se requieren valores para todos los parámetros y manejará cada caso dentro de él. También está claro cómo usarlo desde la interfaz.
Es un truco, pero funcionará.
fuente
Tuve que hacer esto en un servicio web VB.Net 2.0. Terminé especificando los parámetros como cadenas, luego los convertí a lo que necesitaba. Se especificó un parámetro opcional con una cadena vacía. No es la solución más limpia, pero funcionó. Solo tenga cuidado de detectar todas las excepciones que pueden ocurrir.
fuente
Por si acaso si alguien quiere pasar una devolución de llamada (o
delegate
) como parámetro opcional, puede hacerlo de esta manera.Parámetro de devolución de llamada opcional:
fuente
¡Los parámetros opcionales no son más que parámetros predeterminados! Le sugiero que les dé los dos parámetros predeterminados. GetFooBar (int a = 0, int b = 0) si no tiene ningún método sobrecargado, dará como resultado a = 0, b = 0 si no pasa ningún valor, si pasa 1 valor, dará como resultado , pasó el valor para a, 0 y si pasa 2 valores, el primero se asignará a ay el segundo a b.
Espero que responda tu pregunta.
fuente
En el caso de que los valores predeterminados no estén disponibles, la forma de agregar un parámetro opcional es usar la clase .NET OpcionalAtributo - https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.optionalattribute ? view = netframework-4.8
A continuación se muestra un ejemplo del código:
fuente
Puedes probar esto también
Tipo 1
public void YourMethod(int a=0, int b = 0) { //some code }
Tipo 2
public void YourMethod(int? a, int? b) { //some code }
fuente