คำตอบสั้น ๆ : ความสอดคล้อง
เพื่อที่จะตอบคำถามของคุณอย่างถูกต้องฉันขอแนะนำให้คุณย้อนกลับไปดูปัญหาของความเท่าเทียมกันในภาษาการเขียนโปรแกรม มีความเป็นไปได้ที่แตกต่างกันอย่างน้อยสามอย่างซึ่งใช้ในภาษาต่างๆ:
- Reference equality : หมายถึง a = b เป็นจริงถ้า a และ b อ้างถึงวัตถุเดียวกัน มันจะไม่เป็นจริงถ้า a และ b อ้างถึงวัตถุต่าง ๆ แม้ว่าคุณลักษณะทั้งหมดของ a และ b จะเหมือนกัน
- ตื้นเสมอภาค : หมายความว่า a = b เป็นจริงถ้าคุณลักษณะทั้งหมดของวัตถุที่ a และ b อ้างถึงเหมือนกัน ความเท่าเทียมกันของตื้นสามารถนำมาใช้ได้อย่างง่ายดายโดยการเปรียบเทียบระดับบิตของพื้นที่หน่วยความจำที่แสดงถึงวัตถุทั้งสอง โปรดทราบว่าความเท่าเทียมกันอ้างอิงหมายถึงความเท่าเทียมกันตื้น
- Deep equality : หมายถึง a = b เป็นจริงถ้าแต่ละแอตทริบิวต์ใน a และ b นั้นเหมือนกันหรือลึกเท่ากัน โปรดทราบว่าความเท่าเทียมกันอย่างลึกซึ้งนั้นมีความหมายโดยทั้งความเท่าเทียมกันในการอ้างอิงและความเท่าเทียมที่ตื้น ในแง่นี้ความเท่าเทียมกันลึก ๆ คือรูปแบบที่อ่อนแอที่สุดของความเท่าเทียมกันและความเท่าเทียมกันในการอ้างอิงคือสิ่งที่แข็งแกร่งที่สุด
ความเท่าเทียมกันทั้งสามประเภทนี้มักจะใช้เพราะสะดวกในการนำไปใช้: การตรวจสอบความเท่าเทียมกันทั้งสามสามารถสร้างได้อย่างง่ายดายโดยคอมไพเลอร์ (ในกรณีที่มีความเสมอภาคกันลึกคอมไพเลอร์อาจต้องใช้แท็กบิตเพื่อป้องกันลูปไม่สิ้นสุด เปรียบเทียบได้มีการอ้างอิงแบบวงกลม) แต่มีปัญหาอื่น: สิ่งเหล่านี้อาจไม่เหมาะสม
ในระบบที่ไม่สำคัญความเท่าเทียมกันของวัตถุมักจะถูกกำหนดเป็นบางสิ่งบางอย่างระหว่างความลึกและความเท่าเทียมกันอ้างอิง ในการตรวจสอบว่าเราต้องการคำนึงถึงวัตถุสองชิ้นเท่ากันในบริบทหนึ่งหรือไม่เราอาจต้องการคุณลักษณะบางอย่างที่จะเปรียบเทียบโดยที่มันอยู่ในหน่วยความจำและอื่น ๆ ด้วยความเท่าเทียมกันลึกในขณะที่คุณลักษณะบางอย่างอาจได้รับอนุญาตให้แตกต่างกัน สิ่งที่เราต้องการคือ“ ความเสมอภาคแบบสี่” ซึ่งเป็นสิ่งที่ดีจริงๆซึ่งมักถูกเรียกว่าในความหมายเชิงวรรณกรรม ทุกสิ่งเท่าเทียมกันในโดเมนของเรา =)
ดังนั้นเราสามารถกลับมาที่คำถามของคุณ:
มีประโยชน์ที่สำคัญของการเริ่มต้นสิ่งนี้ที่ฉันเพิ่งหายไปหรือไม่หรือดูเหมือนว่าเหตุผลที่พฤติกรรมเริ่มต้นควรเป็นความเท่าเทียมกันทางตรรกะและการเริ่มต้นกลับไปอ้างอิงความเท่าเทียมกันถ้าไม่มีความเท่าเทียมกันเชิงตรรกะสำหรับชั้นเรียน?
เราหมายถึงอะไรเมื่อเราเขียน 'a == b' ในภาษาใด ๆ โดยหลักการแล้วมันควรจะเหมือนกัน: ความเสมอภาคทางความหมาย แต่นั่นเป็นไปไม่ได้
หนึ่งในข้อควรพิจารณาหลักคืออย่างน้อยสำหรับประเภทอย่างง่ายเช่นตัวเลขเราคาดว่าตัวแปรสองตัวจะเท่ากันหลังจากการกำหนดค่าเดียวกัน ดูด้านล่าง:
var a = 1;
var b = a;
if (a == b){
...
}
a = 3;
b = 3;
if (a == b) {
...
}
ในกรณีนี้เราคาดหวังว่า 'a เท่ากับ b' ในทั้งสองข้อความ สิ่งอื่นใดที่จะเสียสติ ภาษาส่วนใหญ่ (ถ้าไม่ใช่ทั้งหมด) เป็นไปตามอนุสัญญานี้ ดังนั้นด้วยประเภทที่เรียบง่าย (ค่า aka) เรารู้วิธีการบรรลุความเท่าเทียมกันทางความหมาย ด้วยวัตถุนั่นอาจเป็นสิ่งที่แตกต่างอย่างสิ้นเชิง ดูด้านล่าง:
var a = new Something(1);
var b = a;
if (a == b){
...
}
b = new Something(1);
a.DoSomething();
b.DoSomething();
if (a == b) {
...
}
เราคาดหวังว่า 'ถ้า' คนแรกจะเป็นจริงเสมอ แต่สิ่งที่คุณคาดหวังในที่สอง 'ถ้า'? มันขึ้นอยู่กับ 'DoSomething' สามารถเปลี่ยนความเท่าเทียมกัน (semantic) ของ a และ b ได้หรือไม่?
ปัญหาเกี่ยวกับความหมายของความเท่าเทียมกันก็คือว่ามันไม่สามารถสร้างขึ้นโดยอัตโนมัติโดยรวบรวมวัตถุหรือ it's เห็นได้ชัดจากงานที่มอบหมาย ต้องจัดเตรียมกลไกสำหรับผู้ใช้เพื่อกำหนด semantic equality ในภาษาเชิงวัตถุกลไกที่เป็นวิธีการที่ได้รับมรดกมา: เท่ากับ การอ่านรหัส OO บางส่วนเราไม่คาดหวังว่าวิธีการจะมีการใช้งานที่แน่นอนเหมือนกันในทุกชั้นเรียน เราคุ้นเคยกับการสืบทอดและการบรรทุกเกินพิกัด
อย่างไรก็ตามด้วยผู้ประกอบการเราคาดหวังว่าพฤติกรรมเดียวกัน เมื่อคุณเห็น 'a == b' คุณควรคาดหวังความเท่าเทียมแบบเดียวกัน (จาก 4 ด้านบน) ในทุกสถานการณ์ ดังนั้นการมีจุดมุ่งหมายเพื่อความมั่นคงนักออกแบบภาษาจึงใช้ความเท่าเทียมกันในการอ้างอิงสำหรับทุกประเภท ไม่ควรขึ้นอยู่กับว่าโปรแกรมเมอร์เขียนทับวิธีการหรือไม่
ป.ล. : ภาษาดีแตกต่างจาก Java และ C # เล็กน้อย: ตัวดำเนินการเท่ากับหมายถึงความเสมอภาคแบบตื้นสำหรับประเภทที่เรียบง่ายและความเท่าเทียมกันทางความหมายสำหรับคลาสที่ผู้ใช้กำหนดเอง ในฐานะที่เป็นประเภทที่เรียบง่ายความเสมอภาคตื้นตื้นมักจะมีความหมายเชิง semantic เสมอกันภาษานั้นสอดคล้องกัน แม้ว่าราคาที่จ่ายนั้นจะเท่ากับว่าผู้ให้บริการเท่ากับโดยค่าเริ่มต้นไม่ได้กำหนดสำหรับประเภทที่ผู้ใช้กำหนด คุณต้องใช้มัน และบางครั้งก็น่าเบื่อ