ชั้นเรียนเป็นประเภทอ้างอิงและโครงสร้างเป็นประเภทค่า
เมื่อฉันพูดว่า Classes เป็นประเภทอ้างอิง
โดยพื้นฐานแล้วพวกเขาจะมีที่อยู่ของตัวแปรอินสแตนซ์
ตัวอย่างเช่น:
Class MyClass
{
Public Int DataMember; //By default, accessibility of class data members
//will be private. So I am making it as Public which
//can be accessed outside of the class.
}
ในวิธีการหลัก
ฉันสามารถสร้างอินสแตนซ์ของคลาสนี้โดยใช้โอเปอเรเตอร์ใหม่ที่จัดสรรหน่วยความจำสำหรับคลาสนี้
และเก็บที่อยู่พื้นฐานของนั้นลงในตัวแปรประเภท MyClass (_myClassObject2)
Static Public void Main (string[] arg)
{
MyClass _myClassObject1 = new MyClass();
_myClassObject1.DataMember = 10;
MyClass _myClassObject2 = _myClassObject1;
_myClassObject2.DataMember=20;
}
ในโปรแกรมด้านบน MyClass _myClassObject2 = _myClassObject1; คำสั่งระบุว่าตัวแปรทั้งสองประเภท MyClass
- myClassObject1
- myClassObject2
และจะชี้ไปที่ตำแหน่งหน่วยความจำเดียวกัน
โดยทั่วไปจะกำหนดตำแหน่งหน่วยความจำเดียวกันเป็นตัวแปรประเภทเดียวกันอีกประเภทหนึ่ง
ดังนั้นหากการเปลี่ยนแปลงใด ๆ ที่เราทำในวัตถุประเภทใดประเภทหนึ่ง MyClass จะมีผลกระทบกับสิ่งอื่น
เนื่องจากทั้งคู่ชี้ไปยังตำแหน่งหน่วยความจำเดียวกัน
"_myClassObject1.DataMember = 10;" ที่บรรทัดนี้ทั้งข้อมูลสมาชิกของวัตถุจะมีค่า 10
"_myClassObject2.DataMember = 20;" ที่บรรทัดนี้ทั้งข้อมูลสมาชิกของวัตถุจะมีค่าเป็น 20
ในที่สุดเรากำลังเข้าถึงดาต้ามิเตอร์ของวัตถุผ่านพอยน์เตอร์
โครงสร้างเป็นประเภทค่า ตัวอย่างเช่น:
Structure MyStructure
{
Public Int DataMember; //By default, accessibility of Structure data
//members will be private. So I am making it as
//Public which can be accessed out side of the structure.
}
Static Public void Main (string[] arg)
{
MyStructure _myStructObject1 = new MyStructure();
_myStructObject1.DataMember = 10;
MyStructure _myStructObject2 = _myStructObject1;
_myStructObject2.DataMember = 20;
}
ในโปรแกรมข้างต้น
การทำให้วัตถุของ MyStructure เป็นอินสแตนซ์โดยใช้ตัวดำเนินการใหม่และการ
จัดเก็บที่อยู่ลงในตัวแปร _myStructObject ของประเภท MyStructure และ
กำหนดค่า 10 ให้กับสมาชิกข้อมูลของโครงสร้างโดยใช้ "_myStructObject1.DataMember = 10"
ในบรรทัดถัดไป
ฉันประกาศอีกตัวแปร _myStructObject2 ประเภท MyStructure และกำหนด _myStructObject1 ลงในนั้น
ที่นี่. NET C # คอมไพเลอร์สร้างอีกสำเนาของวัตถุ _myStructureObject1 และ
กำหนดตำแหน่งหน่วยความจำนั้นให้กับตัวแปร MyStructure _myStructObject2
ดังนั้นการเปลี่ยนแปลงใด ๆ ก็ตามที่เราทำกับ _myStructObject1 จะไม่มีผลกับตัวแปรอื่น _myStructObject2 ประเภท MyStructrue
นั่นเป็นเหตุผลที่เราพูดว่าโครงสร้างเป็นประเภทค่า
ดังนั้นคลาสฐานทันทีสำหรับคลาสคือ Object และคลาสฐานทันทีสำหรับโครงสร้างคือ ValueType ซึ่งสืบทอดจาก Object
ชั้นเรียนจะสนับสนุนการสืบทอดในขณะที่โครงสร้างจะไม่
เราจะพูดอย่างไร
และอะไรคือเหตุผลที่อยู่เบื้องหลัง
คำตอบคือคลาส
มันอาจเป็นนามธรรมปิดผนึกคงที่และบางส่วนและไม่สามารถเป็นส่วนตัวได้รับการป้องกันและป้องกันภายใน