C #: asigne el mismo valor a múltiples variables en una sola declaración


161

¿Hay alguna manera (solo por curiosidad porque me encontré con múltiples asignaciones del mismo valor a múltiples variables hoy) en C # para asignar un valor a múltiples variables a la vez en una sola declaración?

Algo a lo largo de estas líneas (pseudocódigo):

int num1 = 1;
int num2 = 1;

num1 & num2 = 5;

Probablemente no, pero pensé que valía la pena preguntar en caso de que algo similar sea realmente posible.

Respuestas:


258

Es tan simple como:

num1 = num2 = 5;

Cuando se usa una propiedad de objeto en lugar de variable, es interesante saber que getno se llama al descriptor de acceso del valor intermedio. Solo setse invoca el descriptor de acceso para todas las propiedades a las que se accede en la secuencia de asignación.

Tomemos por ejemplo una clase que escribe en la consola cada vez que se invoca el gety el descriptor de setacceso.

static void Main(string[] args)
{
    var accessorSource = new AccessorTest(5);
    var accessor1 = new AccessorTest();
    var accessor2 = new AccessorTest();

    accessor1.Value = accessor2.Value = accessorSource.Value;

    Console.ReadLine();
}

public class AccessorTest
{
    public AccessorTest(int value = default(int))
    {
        _Value = value;
    }

    private int _Value;

    public int Value
    {
        get
        {
            Console.WriteLine("AccessorTest.Value.get {0}", _Value);
            return _Value;
        }
        set
        {
            Console.WriteLine("AccessorTest.Value.set {0}", value);
            _Value = value;
        }
    }
}

Esto dará salida

AccessorTest.Value.get 5
AccessorTest.Value.set 5
AccessorTest.Value.set 5

Lo que significa que el compilador asignará el valor a todas las propiedades y no volverá a leer el valor cada vez que se asigne.


36
No es extraño en realidad. La lógica es la siguiente: la operación de asignación en sí misma devuelve un valor, que es el valor que se ha asignado. La secuencia de ejecución es: num1 = (num2 = 5)y la primera asignación que se ejecuta ( num2 = 5) devuelve el valor 5 al mundo exterior, que a su vez se asigna a num1. Esto funciona ad infinitum ( num0 = num1 = num2 = 5).
Jpsy

Si quieres probarlo, inténtalo Console.WriteLine(num = 5);. (Descargo de responsabilidad: aún no lo he hecho)
Arlen Beiler

3
Pregunta: ¿Se considera esto una mala práctica num1 = num2 = 5? ¿Se vuelve ilegible el código si hay más variables involucradas? Lamento secuestrar, no quería crear una nueva publicación solo para eso.
johnildergleidisson

No hay una respuesta correcta. Lo uso apenas en mi programa y podría haberlo evitado.
Pierre-Alain Vigeant

Hasta el estilo de codificación, supongo que entonces. Gracias por la respuesta.
johnildergleidisson

54

Esto hará que quieras que quieras:

int num1, num2;
num1 = num2 = 5;

La asignación 'num2 = 5' devolverá el valor asignado.

Esto le permite hacer cosas locas como num1 = (num2 = 5) +3;asignar 8 a num1, aunque no recomendaría hacerlo ya que no es muy legible.


No funciona más.
Aurelien B

33
int num1=5,num2=5

Declarando y asignando variables en la misma declaración.


¿Es esta una sola declaración o dos declaraciones?
Merin Nakarmi

gran respuesta, pero se ve raro cuando "5" es una constante de cadena larga. string a = "really long string", b = "really long string";
Alex

13

Algo un poco más corto en sintaxis pero tomando lo que los otros ya han dicho.

int num1, num2 = num1 = 1;

Creo que esta es la mejor respuesta porque tanto la inicialización como la asignación se pueden hacer en una sola declaración.
Sachin Parashar

11

Prueba esto:

num1 = num2 = 5;

Tenga en cuenta que esto no funcionará en VB.


1
¿Sabes si hay alguna sintaxis alternativa para los desarrolladores de VB o si la asignación múltiple simplemente no está disponible en VB?
ckittel

3
@cki: AFAIK, no es compatible.
SLaks

@ckittel In VB =se usa tanto para la asignación como para la igualdad, por num1 = num2 = 5lo que significaría "asignar el resultado booleano de si cinco es igual o no num2a la variable num1". Debido a que el =operador tiene estos dos significados, no hay forma de representar esta sintaxis. Lo mejor que puede hacer es crear una función que tome varios parámetros byref, así como un valor y asigne todos los parámetros a ese valor.
Servy


5
int num1, num2, num3;

num1 = num2 = num3 = 5;

Console.WriteLine(num1 + "=" + num2 + "=" + num3);    // 5=5=5


5

Tu ejemplo sería:

int num1 = 1;
int num2 = 1;

num1 = num2 = 5;


0

Esto ahora es una cosa en C #:

var (a, b, c) = (1, 2, 3);

Al hacer lo anterior, básicamente ha declarado tres variables. a = 1, b = 2Y c = 3. Todo en una sola línea.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.