ต้องการการตีความของส่วนในข้อกำหนด C #


11

ฉันกำลังอ่านสเปค C # ฉันสามารถใช้ความกระจ่างในเซ็กเมนต์:

C # มีระบบพิมพ์รวม ชนิด C # ทั้งหมดรวมถึงชนิดดั้งเดิมเช่น int และ double สืบทอดมาจากประเภทวัตถุรากเดียว ดังนั้นทุกประเภทแบ่งปันชุดของการดำเนินงานทั่วไปและค่าของประเภทใด ๆ สามารถจัดเก็บขนส่งและดำเนินการในลักษณะที่สอดคล้องกัน นอกจากนี้ C # ยังสนับสนุนทั้งประเภทการอ้างอิงที่ผู้ใช้กำหนดและประเภทค่าช่วยให้การจัดสรรวัตถุแบบไดนามิกเช่นเดียวกับการจัดเก็บข้อมูลในบรรทัดของโครงสร้างที่มีน้ำหนักเบา

“ ที่เก็บข้อมูลในบรรทัดของโครงสร้างที่มีน้ำหนักเบา” หมายถึงอะไรในบริบทนี้

คำตอบ:


11

คำตอบของ Svick นั้นดี แต่ฉันคิดว่าฉันจะเพิ่มคะแนนพิเศษอีกเล็กน้อย

ก่อนปิดวรรคมีข้อบกพร่อง ประเภทตัวชี้ไม่สืบทอดมาจากวัตถุ ค่าที่ทราบ ณ เวลารวบรวมเป็นประเภทอินเตอร์เฟสหรือชนิดพารามิเตอร์จะ ณ เวลารันไทม์จะเป็นการอ้างอิงที่ไม่ถูกต้องหรืออินสแตนซ์ bona-fide ของสิ่งที่สืบทอดมาจากวัตถุ แต่มันก็มีโครงสร้างที่แปลกสำหรับฉันเสมอ สืบทอด "จากวัตถุ การสืบทอดเป็นคุณสมบัติที่สมาชิกของบรรพบุรุษเป็นสมาชิกของผู้สืบทอด แต่โดยปกติคุณไม่คิดว่า "ToString" เป็นสมาชิกของ IEnumerable คุณคิดว่ามันเป็นการเป็นสมาชิกของสิ่งที่ดำเนินการ IEnumerable

ย่อหน้านี้ยังมีข้อบกพร่องเพราะนี่เป็นเพียงสถานที่เดียว "ประเภทดั้งเดิม" ปรากฏขึ้นในสเป็คและมันจะปรากฏขึ้นโดยไม่มีคำนิยาม ดังนั้นจึงไม่จำเป็นและสับสนและควรลบ

ฉันต้องการให้ย่อหน้านี้ได้รับการแก้ไขชั่วขณะหนึ่ง ครั้งต่อไปที่ฉันเห็น Mads ฉันจะเตือนเขา

ในการตอบคำถามที่เฉพาะเจาะจงของคุณ: svick ถูกต้องแน่นอน แต่จะเป็นประโยชน์ในการดูตัวอย่างที่เฉพาะเจาะจง เมื่อคุณพูดว่า:

struct ColorfulInt
{
    int value;
    Color color;
    ...
}

และคุณสร้างพูดอาร์เรย์:

ColorfulInt[] x = new ColorFulInt[100];

แล้วจัดเก็บข้อมูลสำหรับผู้ ints 100 และ 100 สีไปในอาร์เรย์ของตัวเอง ถ้า ColorfulInt เป็นคลาสแล้วอาร์เรย์จะมีการอ้างอิงถึง 100 ถึง ColorfulInt แต่ละอันจะต้องถูกจัดสรรแยกต่างหาก การจัดสรรองค์ประกอบร้อยรายการแยกกันนั้นมีประสิทธิภาพน้อยกว่าทั้งในเวลาและพื้นที่มากกว่าการจัดสรรพื้นที่เก็บข้อมูลในอาร์เรย์เอง


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

@ChuckT: ถูกต้อง คุณไม่ต้องจ่ายค่าโสหุ้ยของการอ้อมค้อมและคุณจะได้รับตำแหน่งแคชที่ดี
Eric Lippert

12

หมายความว่าประเภทค่าจะถูกจัดเก็บโดยตรงซึ่งคุณกำหนดประเภทซึ่งจะทำให้มีประสิทธิภาพมากขึ้นเมื่อเทียบกับประเภทอ้างอิง

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


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