เหตุใดอาร์เรย์ใน. Net จึงมีความยาว แต่คอลเลกชันประเภทอื่นมีจำนวนถึง [ปิด]


23

ใน C # ตัวอย่างอาร์เรย์มีคุณสมบัติความยาว แต่คอลเล็กชันประเภทอื่น ๆ เช่นรายการ ฯลฯ มีคุณสมบัติ Count มีเหตุผลทำไมทั้งสองนี้แตกต่างกันอย่างไร ถ้าฉันอยากรู้


4
ฉันหา Lippert-whistle ของฉันไม่ได้ดังนั้นฉันไม่คิดว่าเราจะได้คำตอบที่ดีในวันนี้ :(
MetaFight

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

4
ฉันเดาว่าโพสต์สแต็คโอเวอร์โฟลว์อดีตนี้มีคำตอบที่ถูกต้อง
Doc Brown

6
@MetaFight: เมื่อเร็ว ๆ นี้ฉันได้บันทึกวิดีโอเพื่อการศึกษาหลายชุดและ ณ จุดหนึ่งฉันพูดถึงว่าฉันไม่รู้ว่าทำไมนักออกแบบจึงใช้ทั้งความยาวและจำนวน มันทำให้ฉันประหลาดใจเสมอ ความคิดเห็นจากจูลส์ด้านบนดูเหมือนว่าเป็นไปได้
Eric Lippert

3
Meta note - ฉันใช้ VTC ตัวที่ 5 เพราะฉันไม่เชื่อว่าคำถามนี้สามารถตอบได้อย่างชัดเจน คำตอบที่มีอยู่เป็นคำตอบที่มั่นคงและน่าเชื่อถือ แต่ไม่ได้รับการสนับสนุนด้วยหลักฐาน ในทำนองเดียวกันความคิดเห็นของ Lippert ทำให้ฉันคิดว่าไม่มีใครรู้คำตอบเท่าที่ควรเนื่องจากการกำกับดูแลเมื่อเทียบกับการตัดสินใจอย่างมีสติ

คำตอบ:


30

พวกเขามีชื่อแตกต่างกันเพราะความหมายพวกเขาค่อนข้างแตกต่างกัน:

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

ความยาวของอาร์เรย์คือจำนวนไอเท็มสูงสุดที่สามารถเก็บได้ (จะมีความยาว 10 แม้ว่าคุณจะไม่ได้เก็บไอเท็มนั้นไว้ในนั้น) และเปลี่ยนรูปไม่ได้

ตัวอย่าง:

ถ้าฉันมีถังที่สามารถบรรจุลูกบอลได้สูงสุด 100 ลูกมันจะมีความยาว 100 ถ้าฉันใส่ 50 ลูกเข้าไปก็จะมีจำนวน 50

ถ้าฉันเพิ่มอีก 10 ลูกการนับกลายเป็น 60 แต่ความยาวยังคงเป็น 100 ในการเปลี่ยนความยาวฉันต้องได้ถังที่แตกต่างกัน

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


12
T[]มีความยาว N Tเสมอเก็บว่าไม่มีค่าประเภท ความหมายไม่ใช่ว่าค่าทั้งหมดอาจมีความหมาย (อาจเป็นnullตัวอย่าง) แต่มีอยู่จริง สิ่งนี้แตกต่างจากความหมายปกติของความจุ (ตามList<T>ตัวอย่างที่ใช้) คุณถูกที่Countสามารถเปลี่ยนแปลงได้ในขณะที่Lengthไม่สามารถ จากนั้นอีกครั้งไม่มีอะไรเปลี่ยนแปลงคำสั่งที่Countจริงแล้วจะเปลี่ยนแปลง มันยังใช้สำหรับคอลเลกชันที่ไม่เปลี่ยนรูป

@delnan โอ้ที่รัก ไม่ทราบว่าคำว่า Capacity ถูกใช้ไปแล้วใน C # เช่นนี้ ฉันตั้งใจทำมันมากเกินไป ขอบคุณที่ชี้นำสิ่งนี้ ฉันจะอัปเดตคำตอบของฉันเพื่อชี้แจง
combinatorics

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

@StupidOne: หากคุณไปเส้นทางนั้นอาร์เรย์ใด ๆ ควรมีcount-property
Deduplicator

1
Stringn ประณาม Damn ... ในภาษาที่เข้มงวดกว่าเช่น Vigil คลาส StringBuilder จะถูกลงโทษอย่างเหมาะสมเนื่องจากการทำลายการประชุมgithub.com/munificent/vigil
Falco
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.