คุณจำเป็นต้องใช้คีย์เวิร์ด "ใหม่" ใน Dart หรือไม่


99

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

แทนfinal widget = new Widget();ฉันยังสามารถใช้final widget = Widget();.

สิ่งนี้มีผลในรหัสหรือไม่?

คำตอบ:


125

ไม่มันไม่ได้ กับโผ 2 (คลิกเพื่อประกาศมีข้อมูลเพิ่มเติม)newและconstคำหลักที่ถูกสร้างขึ้นมาเป็นตัวเลือก

ซึ่งหมายความว่าnew Widget()จะเหมือนกับWidget()ของมันเอง


อย่างไรก็ตามconstคำหลักสามารถเปลี่ยนค่าที่จะไม่เป็นค่าconstโดยปริยายเป็น a const.
ดังนั้นคุณจะต้องระบุอย่างชัดเจนconstเมื่อจำเป็น


6
ทีมโผมีการถอนการบิตสำหรับในขณะนี้และมีสถานการณ์บางอย่างที่newหรือconstจะต้องยังคง (ผมจำไม่ได้ตัวอย่างหรือกฎ) พวกเขาอาจลองอีกครั้งหลังจาก Dart 2 เพื่อให้เป็นทางเลือกทุกที่
GünterZöchbauer

1
ไม่มีสถานที่ที่newจำเป็น หากคุณละเว้นnewจากโปรแกรมที่ถูกต้องโปรแกรมจะยังคงทำงานในลักษณะเดียวกัน หากคุณลบออกconstจากโปรแกรมที่ใช้งานได้ในกรณีส่วนใหญ่ที่คุณจะต้องเขียนconstเพื่อให้โปรแกรมนั้นถูกต้องโปรแกรมจะยังคงใช้ได้ เมื่อใดก็ตามที่มีconstนิพจน์ล้อมรอบอยู่แล้วคุณสามารถละเว้น const ที่ซ้อนกันได้
lrn

20

ในโผที่ 2 หากคุณเรียก constructor เช่นฟังก์ชั่นโดยไม่ต้องnewหรือในด้านหน้าแล้วมันจะเทียบเท่ากับการใช้const newหากคุณต้องการการร้องขอ const คุณควรวางไว้constด้านหน้า

ภายในนิพจน์ const คุณไม่จำเป็นต้องเขียนconstอีกครั้งและในบางบริบทที่ต้องใช้นิพจน์ const (เช่นสลับนิพจน์ case และ initializers ของตัวแปร const) คุณไม่จำเป็นต้องใช้ const ภายนอกด้วยซ้ำ

newดังนั้นคุณจึงไม่จำเป็นต้องเขียน

ทีมภาษา Dart ต้องการอนุญาตให้นิพจน์ที่คุณสามารถแทรกอย่างใดอย่างหนึ่งnewหรือconstและยังคงมีการเรียกใช้ที่ถูกต้อง (นั่นคือตัวสร้าง const ที่มีอาร์กิวเมนต์คงที่) เป็นค่าเริ่มต้นในการแทรกconstแทนnewหวังว่าในการอัปเดต Dart 2 ในช่วงต้นด้วยเหตุผลดังกล่าว ฉันขอแนะนำให้เขียนnewไว้ข้างหน้าObject()หรือตัวสร้างconstอื่น ๆที่คุณต้องการให้วัตถุเป็นอินสแตนซ์ใหม่ นั่นเป็นกรณีที่หายากมากโดยปกติคุณจะไม่สนใจเกี่ยวกับตัวตนของวัตถุที่ไม่เปลี่ยนรูปของคุณ (ซึ่งเป็นเหตุผลว่าทำไมการแทรกconstจึงถือเป็นความคิดที่ดี) (แผนนั้นไม่ได้เลื่อนออกไปดังนั้นคุณสามารถเพิกเฉยต่อสิ่งนี้ได้)


newและconstคำหลักที่แตกต่างกัน มีผลแตกต่างกันในการใช้หน่วยความจำในการคอมไพล์และรันไทม์
Frank Moreno


6

newคำหลักที่ถูกสร้างขึ้นมาเป็นตัวเลือกในโผ 2. ณ ตอนนี้เรียกชั้นเรียนมักจะกลับตัวอย่างใหม่ของชั้นที่ ตามคำแนะนำของฉันคุณสามารถใช้ ( ไม่ใช่ MANDATORY ) นอกนิยามของ Layout แต่ละเว้นใน Layouts

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


จับสิ่งที่ล่มสลายได้ดี
MoGa

2
พฤติกรรมการยุบจะเป็นเฉพาะ IDE คุณควรระบุให้ชัดเจนว่าใช้กับข้อใด
jamesdlin

1
นอกจากนี้ "การเรียกคลาส" (ซึ่งฉันถือว่าคุณหมายถึง "การเรียกใช้ตัวสร้างของคลาส") ไม่ได้ส่งคืนอินสแตนซ์ใหม่ของคลาสเสมอไป หากคุณเรียกใช้ตัวสร้างจากโรงงานคุณอาจได้รับอินสแตนซ์ที่มีอยู่กลับคืนมา นี่คือเหตุผลที่newไม่สนับสนุน: การใช้ดูเหมือนว่าจะสร้างอินสแตนซ์ใหม่โดยไม่มีเงื่อนไขเมื่อมันอาจไม่
jamesdlin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.