การสร้างพารามิเตอร์วัตถุใน {}?


15

ฉันกำลังพยายามถอดรหัสรหัสจากหนังสือ:

List<Person> people = new List<Person>()
{
new Person {FirstName="Homer",LastName="Simpson",Age=47},
new Person {FirstName="Marge",LastName="Simpson",Age=45}
};

บุคคลเป็นเพียงคลาสง่ายๆที่พวกเขาสร้างขึ้นโดยมีฟิลด์มากมาย: ชื่อนามสกุล ฯลฯ ...

สิ่งที่ฉันไม่เข้าใจคือเราไม่ส่งพารามิเตอร์ไปที่นวกรรมิกของบุคคลในวงเล็บปีกกาใช่ไหม ฉันลองทำซ้ำรหัสนี้ แต่ดูเหมือนว่าจะไม่บินผู้ใด?

ขอบคุณสำหรับการป้อนข้อมูล



1
"ฉันลองทำซ้ำรหัสนี้ แต่ดูเหมือนจะไม่บิน" <- คุณต้องใช้ C # 3 (VS 2008) หรือใหม่กว่าเพื่อให้สามารถใช้งานไวยากรณ์นี้ได้
AakashM

ระวังความแตกต่างระหว่างสองแนวคิด: การเริ่มต้นวัตถุและการเติมวัตถุ โดยทั่วไปคุณต้องเริ่มต้นในตัวสร้าง วิธีการตัวอย่างของคุณใช้ดีที่สุดสำหรับประชากรไม่ใช่เพื่อเริ่มต้น
NoChance

คำตอบ:


27

C # ช่วยให้คุณสามารถระบุพารามิเตอร์คุณสมบัติในวงเล็บปีกกาเมื่อวัตถุถูกเริ่มต้น วิธีนี้ช่วยให้คุณสามารถเลือกและเลือกรายการที่จะเริ่มต้นและจะให้เป็นค่าเริ่มต้น

ในทางกลับกันคอนสตรัคให้เรียกใช้โค้ดบล็อกหนึ่งบล็อกด้วยชุดพารามิเตอร์คงที่ ดังนั้นเพื่อให้ได้เอฟเฟ็กต์แบบเดียวกันคุณจะต้องสร้างคอนสตรัคเตอร์หลาย ๆ อันด้วยการรวมกันของคุณสมบัติต่างๆที่คุณอาจต้องการเริ่มต้นซึ่งอาจน่าเบื่อ

var x = new Person {FirstName="Homer",LastName="Simpson",Age=47}; 

เทียบเท่ากับสิ่งนี้ทั้งหมด:

var x = new Person();
x.FirstName="Homer";
x.LastName="Simpson";
x.Age=47;

ยกเว้นว่ามันจะสั้นกว่าและง่ายกว่าในเนื้อหา

นอกจากนี้ยังช่วยในการสร้างเช่นคุณแสดงให้เห็นในคำถามของคุณซึ่งจะน่าเบื่อมากถ้าคุณต้องสร้างตัวแปรชั่วคราวและเริ่มต้นพวกเขาออกมาเหมือนที่ฉันทำที่นี่ก่อนที่จะเพิ่มลงในรายการ (ซึ่งเป็นวิธีที่คุณใช้ในการทำ) ทั้งหมดโดยไม่ต้องใช้ตัวสร้างที่กำหนดไว้อย่างชัดเจนซึ่งจะใช้รายการพารามิเตอร์ที่คุณต้องการซึ่งอาจจะมีหรือไม่มีก็ได้

นอกจากนี้โปรดทราบว่าในขณะที่นวกรรมิกสามารถเริ่มต้นคุณสมบัติด้วย setter ส่วนตัวเทคนิคนี้ (ตามที่ควรจะชัดเจนจากตัวอย่างที่ให้ไว้) จะทำงานเฉพาะเมื่อคุณมี setter สาธารณะสำหรับคุณสมบัติ โปรดทราบด้วยว่าตัวอย่างที่สั้นลงของฉันโดยปริยายเรียกว่าตัวสร้างปริยาย (ไร้พารามิเตอร์) ซึ่งจะต้องมีอยู่


อาจจะมีมูลค่าเพิ่มที่เนื่องจากนี้คุณสมบัติเริ่มต้นในวงเล็บปีกกาจะต้องตั้งค่าสาธารณะ
Yam Marcovic

@YMMarcovic อ่า ใช่. เพิ่มหมายเหตุลงในเอฟเฟกต์นั้นแล้ว
tylerl

2
อ่าฉันรู้แจ้งและมีคำอธิบายที่ดีเยี่ยม
RealityDysfunction

2
เพื่อให้ได้เอฟเฟกต์ที่คล้ายกันมากกับคอนสตรัคเตอร์เดียวคุณสามารถกำหนดพารามิเตอร์ทั้งหมดให้เป็นตัวเลือก จากนั้นคุณสามารถทำสิ่งที่ต้องการnew Person(lastName: "Simpson")ออกจากfirstNameและageพารามิเตอร์
svick

นี่ไม่ได้อธิบายว่าทำไมคุณไม่สามารถส่งสิ่งเหล่านี้ไปยังผู้สร้างได้เช่นvar x = new Person("Homer", "Simpson", 47);
rayray
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.