C #: присвоить одно и то же значение нескольким переменным в одном операторе


161

Есть ли какой-нибудь способ (просто из любопытства, потому что сегодня я сталкивался с несколькими назначениями с одним и тем же значением нескольким переменным) в C # назначать одно значение нескольким переменным одновременно в одном выражении?

Что-то вроде этого (псевдокод):

int num1 = 1;
int num2 = 1;

num1 & num2 = 5;

Наверное, нет, но я подумал, что стоит спросить, если подобное действительно возможно!

Ответы:


259

Это так просто, как:

num1 = num2 = 5;

При использовании свойства объекта вместо переменной интересно знать, что метод getдоступа к промежуточному значению не вызывается. Толькоset доступа вызывается для всех свойств, к которым осуществляется доступ в последовательности присваивания.

Возьмем, например, класс, запись в консоли Каждый раз, когда getи setсбруя вызываются.

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;
        }
    }
}

Это будет выводить

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

Это означает, что компилятор назначит значение всем свойствам и не будет перечитывать значение каждый раз, когда ему присваивается значение.


36
Это не странно на самом деле. Логика такова: сама операция присваивания возвращает значение, которое является значением, которое было присвоено. Последовательность выполнения: num1 = (num2 = 5)и первое присвоение, которое выполняется ( num2 = 5), возвращает значение 5 внешнему миру, которое, в свою очередь, присваивается num1. Это работает до бесконечности ( num0 = num1 = num2 = 5).
— Jpsy

Если вы хотите проверить это, попробуйте Console.WriteLine(num = 5);. (Отказ от ответственности: у меня еще нет)
— Арлен Бейлер

3
Вопрос: считается ли это плохой практикой num1 = num2 = 5? Код становится нечитаемым, если задействовано больше переменных? Извините за угон, я не хотел создавать новый пост только для этого.
— johnildergleidisson

Там нет правильного ответа. Я использую это только в своей программе, и я мог бы избежать этого.
— Пьер-Ален Вижан

Вплоть до стиля кодирования я предполагаю тогда. Спасибо за ответ.
— johnildergleidisson

54

Это будет хотеть, что вы хотите:

int num1, num2;
num1 = num2 = 5;

Назначение 'num2 = 5' вернет назначенное значение.

Это позволяет вам делать сумасшедшие вещи, такие как num1 = (num2 = 5) +3;присвоение 8 к num1, хотя я бы не рекомендовал делать это, так как это не очень читабельно.


Это больше не работает.
— Аурелиен Б

33
int num1=5,num2=5

Объявление и присвоение переменных в одном выражении.


Это одно утверждение или два утверждения?
— Мерин Накарми

отличный ответ, но выглядит странно, когда «5» - это длинная строковая константа. string a = "really long string", b = "really long string";
— Алекс

13

Что-то немного короче по синтаксису, но с учетом того, что другие уже заявили.

int num1, num2 = num1 = 1;

Я думаю, что это лучший ответ, потому что как инициализация, так и назначение могут быть выполнены в одном выражении.
— Сачин Парашар

11

Попробуй это:

num1 = num2 = 5;

Обратите внимание, что это не будет работать в VB.


1
Знаете ли вы, есть ли какой-нибудь альтернативный синтаксис для разработчиков VB, или множественное назначение просто не доступно в VB?
— ckittel

3
@cki: AFAIK, это не поддерживается.
— Слух

@ckittel В VB =используется как для присваивания, так и для равенства, поэтому num1 = num2 = 5будет означать «присваивать логический результат того, равно или нет пять num2переменным num1». Поскольку =оператор имеет эти два значения, нет способа представить этот синтаксис. Лучшее, что вы можете сделать, - это создать функцию, которая принимает ряд параметров, byrefа также значение и присваивает все параметры этому значению.
— Servy


5
int num1, num2, num3;

num1 = num2 = num3 = 5;

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




0

Теперь это вещь в C #:

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

Делая выше, вы в основном объявили три переменные. a = 1, b = 2И c = 3. Все в одной строке.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.