นอกจากคำตอบที่ดีอื่น ๆ แล้วฉันจะเพิ่มเหตุผลอีกประการหนึ่งว่าทำไมไม่ใส่ C-style constness ลงใน C # คุณพูดว่า:
เราทำเครื่องหมายพารามิเตอร์เป็น const เพื่อให้แน่ใจว่าสถานะจะไม่ถูกเปลี่ยนในวิธีการ
ถ้า const ทำอย่างนั้นจริงจะดีมาก Const ไม่ทำอย่างนั้น const เป็นเรื่องโกหก!
Const ไม่รับประกันว่าฉันสามารถใช้งานได้จริง สมมติว่าคุณมีวิธีการที่ใช้สิ่งที่เป็น const มีผู้เขียนโค้ดสองคน: คนเขียนผู้โทรและคนที่เขียนไฟล์ callee ผู้เขียน callee ได้ทำให้เมธอดใช้ const ผู้เขียนทั้งสองคนคิดว่าอะไรไม่แน่นอนเกี่ยวกับวัตถุ?
ไม่มีอะไร callee มีอิสระที่จะทิ้ง const และทำให้วัตถุกลายพันธุ์ดังนั้นผู้เรียกจึงไม่รับประกันว่าการเรียกเมธอดที่ใช้ const จริงจะไม่กลายพันธุ์ ในทำนองเดียวกัน callee ไม่สามารถสันนิษฐานได้ว่าเนื้อหาของวัตถุจะไม่เปลี่ยนแปลงตลอดการกระทำของ callee; callee สามารถเรียกวิธีการกลายพันธุ์บางอย่างบนนามแฝงที่ไม่ใช่ constของวัตถุ const และตอนนี้วัตถุที่เรียกว่า const มีเปลี่ยนไปแล้ว
C-style const ไม่รับประกันว่าวัตถุจะไม่เปลี่ยนแปลงดังนั้นจึงเสีย ตอนนี้ C มีระบบประเภทที่อ่อนแออยู่แล้วซึ่งคุณสามารถตีความการร่ายซ้ำสองครั้งเป็น int ได้ถ้าคุณต้องการจริงๆดังนั้นจึงไม่ควรแปลกใจที่มันมีระบบประเภทที่อ่อนแอเมื่อเทียบกับ const เช่นกัน แต่ C # ได้รับการออกแบบให้มีระบบประเภทที่ดีซึ่งเป็นระบบประเภทที่เมื่อคุณพูดว่า "ตัวแปรนี้มีสตริง" แสดงว่าตัวแปรมีการอ้างอิงถึงสตริง (หรือ null) จริงๆ แน่นอนว่าเราไม่ต้องการที่จะใส่ C-สไตล์ "const" ปรับปรุงให้เป็นระบบการพิมพ์เพราะเราไม่ต้องการระบบการพิมพ์ที่จะโกหก เราต้องการให้ระบบประเภทมีความแข็งแกร่งเพื่อให้คุณสามารถหาเหตุผลได้อย่างถูกต้องเกี่ยวกับรหัสของคุณ
Const ใน C เป็นแนวทาง ; โดยพื้นฐานแล้วหมายความว่า "คุณสามารถเชื่อใจฉันได้ว่าจะไม่พยายามทำให้สิ่งนี้กลายพันธุ์" ที่ไม่ควรอยู่ในระบบ type ; สิ่งต่างๆในระบบ typeควรเป็นข้อเท็จจริงเกี่ยวกับออบเจ็กต์ที่คุณสามารถให้เหตุผลได้ไม่ใช่แนวทางในการใช้งาน
ตอนนี้อย่าเข้าใจฉันผิด เพียงเพราะ const ใน C แตกลึกไม่ได้หมายความว่าแนวคิดทั้งหมดไม่มีประโยชน์ สิ่งที่ฉันอยากเห็นคือสิ่งที่ถูกต้องและมีประโยชน์จริงๆรูปแบบคำอธิบายประกอบ "const" ที่ใน C # ซึ่งเป็นคำอธิบายประกอบที่ทั้งมนุษย์และคอมไพเลอร์สามารถใช้เพื่อช่วยให้พวกเขาเข้าใจโค้ดและรันไทม์สามารถใช้ทำสิ่งต่างๆเช่นการทำให้พาราเลลไลเซชันอัตโนมัติและ การเพิ่มประสิทธิภาพขั้นสูงอื่น ๆ
ตัวอย่างเช่นลองนึกภาพว่าคุณสามารถ "วาดกล่อง" รอบ ๆ โค้ดและพูดว่า "ฉันรับประกันว่าโค้ดส่วนใหญ่นี้จะไม่มีการกลายพันธุ์ในฟิลด์ใด ๆ ของคลาสนี้" ในแบบที่คอมไพเลอร์สามารถตรวจสอบได้ หรือวาดกรอบที่ระบุว่า " วิธีการที่บริสุทธิ์นี้ทำให้สถานะภายในของวัตถุกลายพันธุ์ แต่ไม่ใช่ด้วยวิธีใด ๆ ที่สังเกตได้นอกกรอบ" วัตถุดังกล่าวอาจจะไม่ปลอดภัยแบบมัลติเธรดโดยอัตโนมัติ แต่มันอาจจะ memoized มีคำอธิบายประกอบที่น่าสนใจทุกประเภทที่เราสามารถใส่รหัสที่จะช่วยให้สามารถเพิ่มประสิทธิภาพที่สมบูรณ์และความเข้าใจที่ลึกซึ้งยิ่งขึ้น เราสามารถทำได้ดีกว่าคำอธิบายประกอบ const สไตล์ C ที่อ่อนแอ
แต่ผมเน้นว่านี้เป็นเพียงการเก็งกำไร เราไม่มีแผนที่จะนำคุณลักษณะประเภทนี้ไปใช้ใน C # เวอร์ชันสมมุติในอนาคตหากยังมีอยู่ซึ่งเรายังไม่ได้ประกาศไม่ทางใดก็ทางหนึ่ง เป็นสิ่งที่ฉันชอบที่จะเห็นและบางสิ่งบางอย่างที่การให้ความสำคัญกับการประมวลผลแบบมัลติคอร์อาจจำเป็นต้องใช้ แต่สิ่งเหล่านี้ไม่ควรตีความว่าเป็นการคาดคะเนหรือการรับประกันคุณลักษณะเฉพาะหรือทิศทางในอนาคตสำหรับ C #
ตอนนี้หากสิ่งที่คุณต้องการเป็นเพียงคำอธิบายประกอบบนตัวแปรภายในซึ่งเป็นพารามิเตอร์ที่ระบุว่า "ค่าของพารามิเตอร์นี้ไม่เปลี่ยนแปลงตลอดทั้งวิธีการ" แน่นอนว่าจะทำได้อย่างง่ายดาย เราสามารถรองรับภาษาท้องถิ่นและพารามิเตอร์ "แบบอ่านอย่างเดียว" ที่จะเริ่มต้นครั้งเดียวและข้อผิดพลาดเวลาคอมไพล์เพื่อเปลี่ยนวิธีการ ตัวแปรที่ประกาศโดยคำสั่ง "ใช้" นั้นเป็นตัวแปรเฉพาะที่อยู่แล้ว เราสามารถเพิ่มคำอธิบายประกอบที่เป็นทางเลือกให้กับคนในพื้นที่และพารามิเตอร์ทั้งหมดเพื่อให้ทำหน้าที่เหมือนตัวแปร "ใช้" ไม่เคยเป็นคุณลักษณะที่มีลำดับความสำคัญสูงมากดังนั้นจึงไม่เคยมีการนำมาใช้