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. Це працює ad infinitum ( num0 = num1 = num2 = 5).
Jpsy

Якщо ви хочете перевірити це, спробуйте Console.WriteLine(num = 5);. (Відмова: я ще не став)
Arlen Beiler

3
Питання: Чи вважається це поганою практикою num1 = num2 = 5? Чи перетворює код нечитабельним, якщо задіяно більше змінних? Вибачте за викрадення, я не хотів створювати нову публікацію саме для цього.
johnildergleidisson

Правильної відповіді немає. Я використовую це лише дещо у своїй програмі, і я міг цього уникати.
П’єр-Ален Віджеант

Я переймаюсь стилем кодування. Дякую за відповідь.
johnildergleidisson

54

Це дійсно хочеться, як ви хочете:

int num1, num2;
num1 = num2 = 5;

Призначення 'num2 = 5' поверне присвоєне значення.

Це дозволяє робити божевільні речі, як-от num1 = (num2 = 5) +3;присвоєння 8 num1, хоча я б не рекомендував робити це як не дуже читабельний.


Це вже не працює.
Aurelien B

33
int num1=5,num2=5

Декларування та призначення змінних у тому самому операторі.


Це одне твердження або два твердження?
Merin Nakarmi

чудова відповідь, але виглядає дивно, коли "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, а також значення і призначає всі параметри цьому значенню.
Сервіс


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.