วัตถุฮีปแบบสแตนด์อโลนทั้งหมดสืบทอดมาจากObject
; ที่เหมาะสมเนื่องจากวัตถุฮีปแบบสแตนด์อโลนทั้งหมดต้องมีลักษณะทั่วไปบางอย่างเช่นวิธีการระบุประเภท ไม่เช่นนั้นหากตัวเก็บขยะมีการอ้างอิงถึงวัตถุฮีปที่ไม่ทราบประเภทมันจะไม่มีทางรู้ว่าบิตใดในหน่วยความจำที่เกี่ยวข้องกับวัตถุนั้นควรถือเป็นการอ้างอิงไปยังวัตถุฮีปอื่น
นอกจากนี้ภายในระบบประเภทมันสะดวกในการใช้กลไกเดียวกันสำหรับการกำหนดสมาชิกของโครงสร้างและสมาชิกของคลาส พฤติกรรมของสถานที่เก็บข้อมูลประเภทค่า (ตัวแปรพารามิเตอร์เขตข้อมูลสล็อตอาเรย์และอื่น ๆ ) นั้นแตกต่างจากสถานที่เก็บข้อมูลประเภทคลาส แต่ความแตกต่างด้านพฤติกรรมดังกล่าวเกิดขึ้นได้ในคอมไพเลอร์ซอร์สโค้ดและเอ็นจิ้นประมวลผล คอมไพเลอร์ JIT) แทนที่จะแสดงในระบบชนิด
สิ่งหนึ่งที่เป็นผลมาจากการทำเช่นนี้คือการกำหนดประเภทของมูลค่ากำหนดสองประเภทได้อย่างมีประสิทธิภาพ - ประเภทที่เก็บสินค้าและประเภทของวัตถุฮีป อดีตอาจถูกแปลงเป็นหลังโดยนัยและหลังอาจถูกแปลงเป็นอดีตผ่าน typecast การแปลงทั้งสองประเภททำงานโดยการคัดลอกฟิลด์สาธารณะและส่วนตัวทั้งหมดจากอินสแตนซ์หนึ่งประเภทที่เป็นปัญหาไปยังอีกฟิลด์หนึ่ง นอกจากนี้ยังเป็นไปได้ที่จะใช้ข้อ จำกัด ทั่วไปเพื่อเรียกใช้สมาชิกอินเตอร์เฟสบนที่เก็บข้อมูลประเภทค่าโดยตรงโดยไม่ต้องทำสำเนาก่อน
ทั้งหมดนี้มีความสำคัญเนื่องจากการอ้างอิงไปยังวัตถุฮีปชนิดค่าทำหน้าที่เหมือนกับการอ้างอิงคลาสและไม่เหมือนกับประเภทค่า พิจารณาตัวอย่างรหัสต่อไปนี้:
สตริง testEnumerator <T> (T) โดยที่ T: IEnumerator <string>
{
var it2 = มัน;
it.MoveNext ();
it2.MoveNext ();
กลับมาในปัจจุบัน;
}
การทดสอบเป็นโมฆะสาธารณะ ()
{
var theList = รายการใหม่ <string> ();
theList.Add ( "เฟร็ด");
theList.Add ( "จอร์จ");
theList.Add ( "เพอร์ซี่");
theList.Add ( "มอลลี่");
theList.Add ( "รอน");
var enum1 = theList.GetEnumerator ();
IEnumerator <string> enum2 = enum1;
Debug.Print (testEnumerator (enum1));
Debug.Print (testEnumerator (enum1));
Debug.Print (testEnumerator (enum2));
Debug.Print (testEnumerator (enum2));
}
หากtestEnumerator()
วิธีการผ่านสถานที่เก็บของประเภทค่าit
จะได้รับอินสแตนซ์ที่มีการคัดลอกฟิลด์สาธารณะและส่วนตัวจากค่าการส่งผ่าน ตัวแปรท้องถิ่นจะถือกรณีอื่นที่มีเขตข้อมูลทั้งหมดจะถูกคัดลอกจากit2
it
การโทรMoveNext
เข้าit2
จะไม่ส่งผลกระทบit
ใด ๆ
หากโค้ดด้านบนถูกส่งผ่านที่เก็บข้อมูลของประเภทคลาสดังนั้นค่าการส่งผ่านit
และและit2
ทั้งหมดจะอ้างถึงวัตถุเดียวกันดังนั้นการเรียกใช้MoveNext()
ที่ใดก็ได้จะเรียกมันได้อย่างมีประสิทธิภาพ
โปรดทราบว่าการส่งList<String>.Enumerator
เพื่อIEnumerator<String>
เปลี่ยนได้อย่างมีประสิทธิภาพจากประเภทค่าเป็นประเภทคลาส ชนิดของวัตถุฮีปคือList<String>.Enumerator
แต่พฤติกรรมจะแตกต่างจากประเภทค่าของชื่อเดียวกัน
object
ในกรอบ NET ส่วนหนึ่งเป็นเพราะมันมีความสามารถขั้นพื้นฐานทั่ววัตถุทั้งหมดเช่นToString()
และGetHashCode()