Leí la versión C ++ de esta pregunta pero realmente no la entendí.
¿Alguien puede explicar claramente si se puede hacer y cómo?
Leí la versión C ++ de esta pregunta pero realmente no la entendí.
¿Alguien puede explicar claramente si se puede hacer y cómo?
En C # 7 y superior, vea esta respuesta .
En versiones anteriores, puede usar la Tupla de .NET 4.0 + :
Por ejemplo:
public Tuple<int, int> GetMultipleValue()
{
return Tuple.Create(1,2);
}
Las tuplas con dos valores tienen Item1
y Item2
como propiedades.
public (int sum, int count) GetMultipleValues() { return (1, 2); }
Este ejemplo fue tomado de nuestro tema de documentación sobre este tema .Ahora que se ha lanzado C # 7, puede usar la nueva sintaxis Tuples incluida
que luego podría usarse así:
También puede proporcionar nombres a sus elementos (por lo que no son "Elemento1", "Elemento2", etc.). Puede hacerlo agregando un nombre a la firma o los métodos de devolución:
o
También se pueden deconstruir, lo cual es una nueva característica bastante agradable:
Consulte este enlace para ver más ejemplos sobre lo que se puede hacer :)
fuente
Puedes usar tres formas diferentes
1. parámetros de ref / out
usando ref:
utilizando:
2. struct / class
usando struct:
usando clase:
3. Tupla
Clase de tupla
C # 7 tuplas
fuente
No puede hacer esto en C #. Lo que puede hacer es tener un
Usando el parámetro Usando una clase personalizada (o estructura)out
parámetro o devolver su propia clase (o estructura si desea que sea inmutable).fuente
async
métodos.Tuple
es el camino a seguir (Utilizoout
parámetros en las operaciones sincrónicas, aunque, en realidad son útiles en estos casos.)Si se refiere a devolver múltiples valores, puede devolver una clase / estructura que contiene los valores que desea devolver o usar la palabra clave "out" en sus parámetros, de esta manera:
fuente
El póster anterior es correcto. No puede devolver múltiples valores de un método C #. Sin embargo, tienes un par de opciones:
Los pros y los contras aquí son a menudo difíciles de resolver. Si devuelve una estructura, asegúrese de que sea pequeña porque las estructuras son de tipo de valor y se pasan a la pila. Si devuelve una instancia de una clase, hay algunos patrones de diseño que tal vez quiera usar para evitar causar problemas: los miembros de las clases se pueden modificar porque C # pasa objetos por referencia (no tiene ByVal como lo hizo en VB )
Finalmente, puede usar parámetros de salida, pero limitaría el uso de esto a escenarios cuando solo tiene un par (como 3 o menos) de parámetros; de lo contrario, las cosas se ponen feas y difíciles de mantener. Además, el uso de parámetros de salida puede ser un inhibidor de la agilidad porque la firma de su método tendrá que cambiar cada vez que necesite agregar algo al valor de retorno, mientras que al devolver una instancia de estructura o clase puede agregar miembros sin modificar la firma del método.
Desde un punto de vista arquitectónico, recomendaría no usar pares clave-valor o diccionarios. Creo que este estilo de codificación requiere "conocimiento secreto" en el código que consume el método. Debe saber de antemano cuáles serán las claves y qué significan los valores, y si el desarrollador que trabaja en la implementación interna cambia la forma en que se crea el diccionario o KVP, podría crear fácilmente una cascada de fallas en toda la aplicación.
fuente
Exception
si el segundo valor que desea devolver es disyuntivo del primero: como cuando desea devolver un tipo de valor exitoso o un tipo de valor fallido.O se devuelve una instancia de clase o utilizar a cabo parámetros. Aquí hay un ejemplo de nuestros parámetros:
Llámalo así:
fuente
Hay muchas maneras; pero si no desea crear un nuevo Objeto o estructura o algo así, puede hacer lo siguiente después de C # 7.0 :
fuente
En C # 7 hay una nueva
Tuple
sintaxis:Puede devolver esto como un registro:
También puede usar la nueva sintaxis deconstructor:
Sin embargo, tenga cuidado con la serialización, todo esto es azúcar sintáctico: en el código compilado real, esto será un
Tuple<string, int>
(según la respuesta aceptada ) conItem1
y enItem2
lugar defoo
ybar
. Eso significa que la serialización (o deserialización) utilizará esos nombres de propiedad en su lugar.Entonces, para la serialización, declare una clase de registro y devuélvala en su lugar.
También nuevo en C # 7 es una sintaxis mejorada para los
out
parámetros. Ahora puede declarar laout
línea, que es más adecuada en algunos contextos:Sin embargo, principalmente usará esto en las propias bibliotecas de .NET, en lugar de en sus propias funciones.
fuente
Otras respuestas indicaron el uso de Tuple, que también recomendaría, pero con la nueva característica introducida en C # 7.0.
Se puede encontrar más información aquí .
fuente
Hay varias formas de hacerlo. Puedes usar
ref
parámetros:Esto pasa una referencia a la función permitiendo así que la función modifique el objeto en la pila del código de llamada. Si bien esto no es técnicamente un valor "devuelto", es una forma de hacer que una función haga algo similar. En el código anterior, la función devolvería una
int
y (potencialmente) modificaciónbar
.Otro enfoque similar es usar un
out
parámetro. Unout
parámetro es idéntico a unref
parámetro con una regla adicional forzada por el compilador. Esta regla es que si pasa unout
parámetro a una función, esa función debe establecer su valor antes de regresar. Además de esa regla, unout
parámetro funciona igual que unref
parámetro.El enfoque final (y el mejor en la mayoría de los casos) es crear un tipo que encapsule ambos valores y permita que la función devuelva eso:
Este enfoque final es más simple y fácil de leer y comprender.
fuente
No, no puede devolver múltiples valores de una función en C # (para versiones inferiores a C # 7), al menos no de la forma en que puede hacerlo en Python.
Sin embargo, hay un par de alternativas:
Puede devolver una matriz de objetos tipo con los múltiples valores que desee.
Puedes usar
out
parámetros.fuente
En C # 4, podrá utilizar el soporte integrado para tuplas para manejar esto fácilmente.
Mientras tanto, hay dos opciones.
Primero, puede usar los parámetros ref o out para asignar valores a sus parámetros, que se transfieren a la rutina de llamada.
Esto se ve así:
En segundo lugar, puede resumir sus valores de retorno en una estructura o clase, y devolverlos como miembros de esa estructura. KeyValuePair funciona bien para 2: para más de 2 necesitaría una clase o estructura personalizada.
fuente
puedes probar este "KeyValuePair"
Salida:
Salida: 1, 2
fuente
Las clases, estructuras, colecciones y matrices pueden contener múltiples valores. Los parámetros de salida y referencia también se pueden configurar en una función. Es posible devolver valores múltiples en lenguajes dinámicos y funcionales mediante tuplas, pero no en C #.
fuente
Principalmente hay dos métodos. 1. Use los parámetros out / ref 2. Devuelva una matriz de objetos
fuente
Aquí hay
Two
métodos básicos :1) Uso de '
out
' como parámetro También puede usar 'out' para las versiones 4.0 y menores.Ejemplo de 'fuera':
Salida:
Área de rectángulo es 20
El perímetro del rectángulo es 18
* Nota: * La
out
palabra clave describe parámetros cuyas ubicaciones variables reales se copian en la pila del método llamado, donde esas mismas ubicaciones se pueden reescribir. Esto significa que el método de llamada accederá al parámetro modificado.2)
Tuple<T>
Ejemplo de tupla:
Devolver múltiples valores de DataType usando
Tuple<T>
Salida
NOTA: El uso de Tuple es válido desde Framework 4.0 y superior .
Tuple
tipo es aclass
. Se asignará en una ubicación separada en el montón administrado en la memoria. Una vez que crea elTuple
, no puede cambiar los valores de sufields
. Esto hace queTuple
más como astruct
.fuente
Puedes recibir un código como
Espero que funcione.
fuente
Un método que toma un delegado puede proporcionar múltiples valores a la persona que llama. Esto toma prestado de mi respuesta aquí y usa un poco de la respuesta aceptada de Hadas .
Las personas que llaman proporcionan una lambda (o una función con nombre) e intellisense ayuda copiando los nombres de las variables del delegado.
fuente
Simplemente use de manera OOP una clase como esta:
El miembro de función devuelve el cociente que interesa principalmente a la mayoría de las personas que llaman. Además, almacena el resto como un miembro de datos, al que la persona que llama puede acceder fácilmente después.
De esta manera, puede tener muchos "valores de retorno" adicionales, muy útiles si implementa llamadas a la base de datos o a la red, donde se pueden necesitar muchos mensajes de error, pero solo en caso de que ocurra un error.
Ingresé esta solución también en la pregunta de C ++ a la que se refiere OP.
fuente
De este artículo, puede usar tres opciones como las publicaciones anteriores.
KeyValuePair es la forma más rápida.
fuera está en el segundo.
La tupla es la más lenta.
De todos modos, esto depende de lo que sea mejor para su escenario.
fuente
La versión futura de C # incluirá tuplas con nombre. Eche un vistazo a esta sesión de channel9 para la demostración https://channel9.msdn.com/Events/Build/2016/B889
Pase a las 13:00 para ver las cosas de las tuplas. Esto permitirá cosas como:
(ejemplo incompleto del video)
fuente
Podrías usar un objeto dinámico. Creo que tiene mejor legibilidad que Tuple.
fuente
Formas de hacerlo:
1) KeyValuePair (Mejor rendimiento - 0.32 ns):
2) Tupla - 5.40 ns:
3) fuera (1.64 ns) o ref 4) Cree su propia clase / estructura personalizada
ns -> nanosegundos
Referencia: valores de retorno múltiple .
fuente
puedes probar esto
fuente
yield return "value1"; yield return "value2";
para no tener que crear explícitamente uno nuevostring[]
?También puedes usar un OperationResult
fuente
Una respuesta rápida especialmente para el tipo de matriz devuelve:
Utilizando:
fuente