C#:1つのステートメントで複数の変数に同じ値を割り当てる


161

C#で1つのステートメントで一度に1つの値を複数の変数に割り当てる方法はありますか(今日、複数の変数への複数の同じ値の割り当てに遭遇したため、好奇心から脱出できますか)?

これらの行に沿った何か(疑似コード):

int num1 = 1;
int num2 = 1;

num1 & num2 = 5;

おそらくそうではないかもしれませんが、実際に同様のことが可能かどうかを尋ねる価値はあると思いました!

回答:


258

それは次のように簡単です:

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);。(免責事項:私はまだです)
Arlen Beiler 2013年

3
質問:これは悪い習慣と見なされnum1 = num2 = 5ますか?より多くの変数が関係している場合、コードは読み取り不可能になりますか?ハイジャックして申し訳ありません。それだけで新しい投稿を作成したくありませんでした。
johnildergleidisson 2013

正解はありません。私のプログラムではほとんど使用せず、回避できたはずです。
Pierre-Alain Vigeant 2013

私が想定しているコーディングスタイルに至るまで。返信いただきありがとうございます。
johnildergleidisson 2013

54

これはあなたが望むことでしょう:

int num1, num2;
num1 = num2 = 5;

'num2 = 5'割り当ては、割り当てられた値を返します。

これによりnum1 = (num2 = 5) +3;、num1に8を割り当てるようなクレイジーなことを行うことができますが、あまり読みにくいため、これを行うことはお勧めしません。


それはもう機能しません。
Aurelien B

33
int num1=5,num2=5

同じステートメントで変数を宣言して割り当てる。


これは単一のステートメントですか、それとも2つのステートメントですか?
Merin Nakarmi

良い答えですが、 "5"が長い文字列定数の場合は奇妙に見えます。 string a = "really long string", b = "really long string";
Alex

13

構文が少し短いが、他の人がすでに述べていることを理解する。

int num1, num2 = num1 = 1;

初期化と割り当ての両方を1つのステートメントで実行できるため、これが最良の答えだと思います。
Sachin Parashar

11

これを試して:

num1 = num2 = 5;

これはVBでは機能しないことに注意してください。


1
VB開発者向けの代替構文があるかどうか、またはVBで複数の割り当てを使用できないことを知っていますか?
ckittel

3
@cki:AFAIK、それはサポートされていません。
SLaks '26 / 06/26

@ckittel VB =では、代入と等価の両方に使用されるため、num1 = num2 = 5「5がnum2変数と等しいかどうかのブール結果を代入する」という意味になりますnum1=演算子にはこれらの2つの意味があるため、この構文を表す方法はありません。最善の方法は、いくつかのパラメーターbyrefと値を取り込んで、すべてのパラメーターをその値に割り当てる関数を作成することです。
2013


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

上記を行うことで、基本的に3つの変数を宣言しました。a = 1b = 2およびc = 3。すべて1行で。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.