C #: กำหนดค่าเดียวกันให้กับตัวแปรหลายตัวในคำสั่งเดียว


161

มีวิธีใดบ้าง (เพิ่งเกิดจากความอยากรู้อยากเห็นเพราะฉันเจอการกำหนดค่าเดียวกันหลาย ๆ ตัวให้กับตัวแปรหลายตัวในวันนี้) ใน C # เพื่อกำหนดหนึ่งค่าให้กับตัวแปรหลายตัวในครั้งเดียว?

บางสิ่งบางอย่างตามสายเหล่านี้ (รหัสเทียม):

int num1 = 1;
int num2 = 1;

num1 & num2 = 5;

อาจจะไม่ใช่ แต่ฉันคิดว่ามันคุ้มค่าที่จะถามในกรณีที่เป็นไปได้จริง ๆ !

คำตอบ:


259

มันง่ายเหมือน:

num1 = num2 = 5;

เมื่อใช้คุณสมบัติวัตถุแทนตัวแปรเป็นที่น่าสนใจที่จะรู้ว่าตัวgetเข้าถึงค่ากลางไม่ถูกเรียกใช้ เพียงsetเรียกใช้ accessor สำหรับคุณสมบัติทั้งหมดที่เข้าถึงได้ในลำดับการกำหนด

ยกตัวอย่างคลาสที่เขียนไปยังคอนโซลทุกครั้งที่มีการเรียกใช้getและsetaccessor

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

3
คำถาม: นี่ถือว่าเป็นการปฏิบัติที่ไม่ดีnum1 = num2 = 5หรือไม่? มันเปลี่ยนรหัสไม่สามารถอ่านได้ถ้ามีตัวแปรที่เกี่ยวข้อง? ขออภัยที่จะจี้ฉันไม่ต้องการที่จะสร้างโพสต์ใหม่เพียงเพื่อมัน
johnildergleidisson

ไม่มีคำตอบที่ถูกต้อง ฉันใช้มันในโปรแกรมของฉันเท่านั้นและฉันสามารถหลีกเลี่ยงได้
Pierre-Alain Vigeant

สไตล์การเขียนลงไปฉันถือว่าแล้ว ขอบคุณสำหรับการตอบกลับ.
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";
Alex

13

มีบางสิ่งที่สั้นกว่าเล็กน้อยในไวยากรณ์ แต่การทำตามสิ่งที่ผู้อื่นได้ระบุไว้

int num1, num2 = num1 = 1;

ฉันคิดว่านี่เป็นคำตอบที่ดีที่สุดเพราะทั้งการเริ่มต้นและการมอบหมายสามารถทำได้ในคำสั่งเดียว
Sachin Parashar

11

ลองสิ่งนี้:

num1 = num2 = 5;

โปรดทราบว่าสิ่งนี้จะไม่ทำงานใน VB


1
คุณรู้หรือไม่ว่ามีบางทางเลือกสำหรับนักพัฒนา VB ซินแท็กซ์หรือการมอบหมายหลายอย่างก็ไม่สามารถใช้ได้ใน VB?
ckittel

3
@cki: AFAIK ไม่รองรับ
SLAK

@ckittel ใน VB =นั้นใช้สำหรับการกำหนดและความเสมอภาคดังนั้นnum1 = num2 = 5จะหมายถึง "กำหนดผลบูลีนว่าห้าหรือไม่เท่ากับnum2ตัวแปรnum1" เนื่องจาก=โอเปอเรเตอร์มีความหมายทั้งสองนี้จึงไม่มีวิธีในการแสดงไวยากรณ์นี้ สิ่งที่ดีที่สุดที่คุณสามารถทำได้คือการสร้างฟังก์ชั่นที่ใช้ในพารามิเตอร์จำนวนหนึ่งbyrefรวมถึงค่าและกำหนดพารามิเตอร์ทั้งหมดให้กับค่านั้น
บริการ






0

นี่คือสิ่งที่อยู่ใน C #:

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

เมื่อทำตามข้างต้นคุณได้ประกาศตัวแปรสามตัว a = 1, และb = 2 c = 3ทั้งหมดในบรรทัดเดียว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.