ทำไมเมธอดที่รับพารามิเตอร์ไม่ จำกัด จำนวนมักกำหนดโอเวอร์โหลดด้วยพารามิเตอร์ที่น้อยลง


36

ตัวอย่างเช่นSystem.IO.Path.Combineวิธีการใน. NET มีการโอเวอร์โหลดดังต่อไปนี้:

Combine(params String[])
Combine(String, String)
Combine(String, String, String)
Combine(String, String, String, String)

จุดสามจุดสุดท้ายคืออะไร?

คนแรกจะครอบคลุมพวกเขาทั้งหมดราวกับว่าคุณดูอย่างใกล้ชิดมันใช้paramsคำหลัก อาร์กิวเมนต์ของความเข้ากันได้ย้อนหลังจะครอบคลุมเฉพาะCombine(String, String)ตัวแปรเนื่องจากเป็นรุ่นเดียวจนถึง. NET 4

คำตอบ:


56

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


สิ่งที่ควรทราบก็คือว่าที่ผ่านCombineกับศูนย์หรือหนึ่งส่วนเส้นทางที่ไม่ได้ทำให้รู้สึกยังparamsรุ่นช่วยให้คุณสามารถทำเช่นนี้
Matthew

4
เหตุผลที่จำนวนเกินพิกัดที่ยอมรับจำนวนอาร์กิวเมนต์ต่างกันนั้นไม่ใช่เพื่อความสะดวกในการอ่าน มันมีไว้สำหรับประสิทธิภาพการทำงานเนื่องจากค่าใช้จ่ายที่เกิดขึ้นโดยการสร้างอาร์เรย์ของสตริงแล้วประมวลผล เหตุผลในการยอมรับparams string[]คือเพื่อให้สามารถอ่านได้
Greg Burghardt

2
ผลการดำเนินงานเป็นที่แน่นอนเหตุผลและผมเชื่อว่ามันเป็นเฉพาะเมื่อฟังก์ชั่นที่คาดว่าจะได้รับการเรียกจากลูปภายใน เมื่อคำอธิบายประกอบของ Brad Abrams ใน p.27 ของภาษาการเขียนโปรแกรม C # รุ่นที่สามกล่าวว่า: "[T] เขารุ่น C # สร้างการจัดสรรวัตถุเพิ่มเติม (อาร์เรย์ที่มี) โดยปริยายในการโทรแต่ละครั้งซึ่งไม่ค่อยมีปัญหา - ประเภทสถานการณ์ลูปที่มันอาจไม่มีประสิทธิภาพเราแนะนำให้จัดเตรียมโอเวอร์โหลดสำหรับเคสหลักและใช้paramsโอเวอร์โหลดสำหรับเคสขอบเท่านั้นตัวอย่างคือStringBuilder.AppendFormat()ตระกูลโอเวอร์โหลด "
Eliah Kagan

3
@LowFlyingPelican Mono และ. NET Framework นั้นไม่เหมือนกัน ถ้าคุณดูที่. NET Framework เวอร์ชั่นจริงๆแล้วมันเป็นทางออกที่แตกต่าง
อเล็กซ์

3
@ LowFlyingPelican: เหตุผลของ. NET Framework คือประสิทธิภาพ เหตุผลของโมโนสำหรับการนำวิธีการนั้นมาใช้คือความเข้ากันได้กับ API กับ. เหตุผลของโมโนในการนำวิธีการนั้นมาใช้คือการใช้งานที่เรียบง่าย (เพราะพวกเขามีทรัพยากรน้อยกว่า Microsoft มาก)
jhominal

4

น้ำตาลซินแทคติค

เมื่อจัดการพา ธ ไฟล์มันเป็นเรื่องธรรมดามากที่จะมีค่าคงที่จำนวนน้อย ในกรณีเหล่านี้สะดวกกว่าที่จะใช้โดยตรงแทนที่จะต้องแพ็กเกจลงในอาร์เรย์


3
ด้วย params คุณกำลัง sugering มันแล้ว msdn.microsoft.com/en-us/library/w5zay9db.aspxไม่จำเป็นต้องมีอาร์เรย์
Thomas Junk

3
ใน C # คุณมีประเด็น @Thomas อย่างไรก็ตาม .NET ยังสนับสนุนภาษาอื่น ๆ paramsได้โดยไม่ต้อง
Karl Bielefeldt

@ThomasJunk ลิงก์นั้นตายไปแล้วสำหรับฉันโชคไม่ดี แต่ฉันแน่ใจว่าคุณพูดถูกเพราะ C # ของฉันนั้นปานกลาง ฉันเพิ่งเห็นหลายไลบรารีที่มีหลายภาษาที่ทำเช่นนั้นเพื่ออนุญาตโค้ดที่สะอาดกว่า
Gort the Robot
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.