En C# 4, ¿hay una buena manera de tener un parámetro de salida opcional?Parámetros de salida opcionales
Respuesta
Nº
Para que sea "opcional", en el sentido de que no es necesario asignar un valor en el método, se puede utilizar ref
.
Un parámetro 'ref' es un caso de uso muy diferente. Un parámetro opcional pasa en un valor específico si la persona que llama no especifica uno: con un parámetro ref, la persona que llama siempre especifica un valor, si sienten que lo han especificado o no. El 'ref' siempre apunta a una ubicación de memoria válida, y una ubicación de memoria válida siempre contiene _something_. En el mejor de los casos, esto es solo un valor mágico sin el beneficio de una especificación predeterminada que dice "el valor predeterminado es X". – danwyand
Sí, esta respuesta no es un juicio de diseño, por lo que agregué el calificador "en el sentido de que". – codekaizen
No realmente, aunque siempre se puede sobrecargar el método con otro que no toma el parámetro de salida.
cualquier idea de cómo manejar el parámetro opcional de forma más elegante que '{string dummy; devuelve Foo (fuera del maniquí); } 'en la sobrecarga que no toma el parámetro de salida? –
@Louis: ¡No, eso es probablemente lo que habría hecho! – Cameron
Eso es mucho código de placa de caldera adicional. – Brain2000
private object[] Func();
asigne tantas salidas opcionales como desee a la matriz de objetos de retorno y luego ¡úselos! pero si quieres decir algo como salida opcional
private void Func(out int optional1, out string optional2)
y luego se llama algo así como
Func(out i);
entonces la respuesta es no, puedes. también C# y .NET Framework tiene muchas estructuras de datos que son muy flexibles como List
y Array
y puede usarlas como un parámetro de salida o como un tipo de retorno para que no haya necesidad de implementar una forma de tener parámetros de salida opcionales.
Decorar los parámetros con OptionalAttribute tampoco funciona. Para ampliar la muestra anterior, obtendrá algo como:
private void Func(
[Optional] out int optional1,
[Optional] out string optional2)
{ /* ... */ }
Tenga en cuenta que lo anterior se compilará (quizás por desgracia). Sin embargo, intentar compilar:
Func(out i);
fallará si no se proporciona explícitamente una sobrecarga con una firma de un solo parámetro.
Para (teóricamente) hacer que el trabajo anterior sea un problema importante. Cuando se llama a un método con un parámetro opcional omitido, se crea un marco de pila que contiene los valores de todos los parámetros y los valores faltantes simplemente se rellenan con los valores predeterminados especificados.
Sin embargo, un parámetro de "salida" es una referencia, no un valor. Si ese parámetro es opcional y no se proporciona, ¿a qué variable se referiría? El compilador aún necesita imponer el requisito de que el parámetro "salir" se complete antes de cualquier devolución normal del método, ya que el compilador no sabe a priori qué parámetros (si los hay) opcionales son especificados por la persona que llama. Esto significa que se debería pasar una referencia a la variable ficticia en algún lugar, por lo que el método tiene algo que llenar. Administrar este espacio variable ficticio crearía un desagradable dolor de cabeza para el escritor del compilador. No estoy diciendo que sería imposible determinar los detalles de cómo funcionaría esto, pero las implicaciones arquitectónicas son tan grandes que Microsoft pasó esta característica de manera comprensible.
public class Dummy<T>
{
public T Value;
}
A continuación, utilice functionDoSomething(out new Dummy<int>().Value
, donde int
podría ser cualquier tipo.
- 1. Parámetros opcionales de Linq
- 2. parámetros opcionales en CodeIgniter
- 3. Router_Route con parámetros opcionales
- 4. Python parámetros opcionales
- 5. Parámetros opcionales con Specflow
- 6. Rubí parámetros opcionales
- 7. \ newcommand/\ newenvironment - parámetros opcionales
- 8. Activator.CreateInstance con parámetros opcionales
- 9. Ruby Métodos y parámetros opcionales
- 10. Parámetros nombrados/opcionales en Delphi?
- 11. Parámetros opcionales para las interfaces
- 12. Menos css con parámetros opcionales
- 13. Enterprise Architect: C# ¿Parámetros opcionales?
- 14. constructor/método de Java con parámetros opcionales?
- 15. evitando el tedio de los parámetros opcionales
- 16. Especificación facultativa de algunos parámetros opcionales C#
- 17. ambigüedad en la interpretación de parámetros opcionales
- 18. Parámetros de obtención opcionales en django?
- 19. spring-data-mongo - parámetros de consulta opcionales?
- 20. enrutamientos de asp.net webforms: parámetros opcionales
- 21. Parámetros nombrados y opcionales, y WCF
- 22. ¿Cómo manejo los parámetros opcionales en Moose?
- 23. asp.net webapi: cómo pasar parámetros opcionales?
- 24. parámetros opcionales en Bash expresión regular
- 25. Parámetros opcionales que no son del sistema
- 26. Procedimiento almacenado con parámetros "DONDE" opcionales
- 27. Parámetros opcionales en el servicio web ASP.NET
- 28. ¿Cómo construir un decorador con parámetros opcionales?
- 29. Parámetros opcionales en métodos administrados de C++/CLI
- 30. DynamicMethod y parámetros de salida?
No encuentra ningún valor para dicha función. Si alguna vez escuchaste las sesiones de compiladores de C# en PDC, verás que cada cambio tiene un significado. –
No estoy de acuerdo con que no haya ningún valor en esta característica. Si un método tiene algo de lógica en él, al igual que devolver datos a través de parámetros de salida, quiero poder invocar esta lógica, simplemente no necesito la salida ... – Alex
Uso Int32.TryParse() para ver si la cadena dada se puede analizar en un número y, si puede, a veces eso es todo lo que me importa. Entonces Jitbit tiene razón. –