ค่าคงที่ใน C #


9

ทำไมคอมไพเลอร์เก็บค่าคงที่ในข้อมูลเมตาแอสเซมบลี? พวกเขาฝังตัวโดยตรงกับรหัสภาษาระดับกลางจากข้อมูลเมตาแอสเซมบลีหรือไม่


1
สิ่งนี้ไม่ได้ระบุว่า 'ทำไม' แต่น่าสนใจจริงๆ: stackoverflow.com/a/2128633/128384
stijn

ฉันสับสนกับคำถามนี้ พวกเขาจะเก็บไว้ที่ไหนถ้าไม่อยู่ในเมทาดาทา คุณช่วยชี้แจงคำถามได้ไหม?
Eric Lippert

คำตอบ:


4

วิธีคิดที่ดีที่สุดที่ฉันพบคือ ณ เวลารวบรวม const จะถูกแปลงเป็นตัวอักษรที่ใช้

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

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


2

ฉันค้นคว้าด้วยตัวเองเป็นเวลานานและพบจากหนังสือว่านี่อาจเป็นเหตุผล ...

เนื่องจากค่าคงที่ไม่เคยเปลี่ยนแปลงค่าคงที่จึงถือเป็นส่วนหนึ่งของประเภทการกำหนด ดังนั้นการกำหนดค่าคงที่จึงสร้างข้อมูลเมตา


1

ฉันคิดว่าคุณผสมผสานสองแอสเซมบลี

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

ไม่มีข้อมูลเกี่ยวกับค่าคงที่ในแอสเซมบลีที่ใช้งานอยู่ ค่าคงที่จะใช้โดยตรงใน IL เช่นเดียวกับที่คุณเขียนจำนวนคงที่หรือสตริงโดยตรงในแหล่งที่มา

ตัวอย่าง: หนึ่งในแอปพลิเคชันของฉันใช้ค่าคงที่จำนวนมากเพื่อระบุตารางฐานข้อมูลและเขตข้อมูล ฉันมีหนึ่งชุดที่มีค่าคงที่ทั้งหมดเท่านั้น

เมื่อฉันสร้างแอปพลิเคชันฉันเพิ่มการอ้างอิงไปยังแอสเซมบลี "ค่าคงที่" ใน Visual Studio เนื่องจากแอสเซมบลีประกอบด้วยค่าคงที่เท่านั้นไม่มีการอ้างอิงถึงในแอปพลิเคชันของฉันและแอสเซมบลี "ค่าคงที่" ไม่จำเป็นในเวลาทำงาน


2
แต่นี่ไม่ได้อธิบายว่าทำไมค่าคงที่ยังคงอยู่ในข้อมูลเมตา มันเต้นไปรอบ ๆ ทำไม แต่ฉันไม่คิดว่า OP จะสร้างความสับสนให้กับทั้งสองชุด คุณเห็นว่ามันเป็นปัญหาสองแอสเซมบลีเพราะคุณใช้สองแอสเซมบลี แต่ฉันไม่คิดว่าการปฏิบัติเป็นเรื่องปกติ ค่าคงที่จะถูกกำหนดโดยทั่วไปในชุดเดียวกันกับที่ใช้
Robert Harvey

@RobertHarvey ข้อสันนิษฐานของคุณเกี่ยวกับกรณีทั่วไปประเมินทักษะของเพื่อนร่วมงาน C # หลายคนฉันมีหลายครั้งที่ต้องอธิบายว่า const คืออะไรกับเพื่อนร่วมงานและทำไมคุณไม่เรียกพวกเขาข้ามการประชุม
Jimmy Hoffa

1

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

ใช่พวกเขาจะถูกโหลดโดยตรงจากเมตาดาต้า จะไม่มีการจัดสรรหน่วยความจำขณะใช้งานจริง


1
ทศนิยมไม่ใช่ประเภทดั้งเดิม แต่คุณสามารถสร้างค่าคงที่แบบทศนิยม และคุณสามารถสร้างค่าคงที่ของประเภทอ้างอิงใด ๆ โดยมีเงื่อนไขว่าค่าคงที่นั้นเป็นโมฆะ
Eric Lippert
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.