ฉันพยายามประกาศค่าคงที่ PI ดังนี้:
public static const double PI = Math.PI;
แต่ทำไมฉันถึงได้รับข้อผิดพลาดนี้
The constant 'Calendar.NewCalendar.PI' cannot be marked static
ฉันพยายามประกาศค่าคงที่ PI ดังนี้:
public static const double PI = Math.PI;
แต่ทำไมฉันถึงได้รับข้อผิดพลาดนี้
The constant 'Calendar.NewCalendar.PI' cannot be marked static
คำตอบ:
constหมายความว่าstatic(คุณไม่จำเป็นต้องมีอินสแตนซ์เพื่ออ้างอิงconstค่า)
ฉันต้องการเพิ่มจุดสำคัญนี้ด้วย: เมื่อคุณเชื่อมโยงกับ (อ้างอิง) แอสเซมบลีที่มี a public constค่านั้นจะถูกคัดลอกไปยังแอสเซมบลีของคุณ ดังนั้นหากconstค่าในแอสเซมบลีที่อ้างอิงเปลี่ยนไปแอสเซมบลีของคุณจะยังคงมีค่าคอมไพล์เดิม
หากพฤติกรรมนี้ไม่เป็นที่ยอมรับคุณควรพิจารณากำหนดเขตข้อมูลให้เป็นpublic static readonlyเขตข้อมูล
Lib.dll ให้เป็นไบนารี:
public class Foo {
public const int HATS = 42;
public static readonly int GLOVES = 33;
}
App.exe อ้างอิง Lib.dll:
Foo.HATS // This will always be 42 even if the value in Lib.dll changes,
// unless App.exe is recompiled.
Foo.GLOVES // This will always be the same as Foo.GLOVES in Lib.dll
จากMSDN :
อย่าสร้างค่าคงที่เพื่อแสดงข้อมูลที่คุณคาดว่าจะเปลี่ยนแปลงได้ตลอดเวลา ตัวอย่างเช่นอย่าใช้ฟิลด์ค่าคงที่ในการจัดเก็บราคาของบริการหมายเลขเวอร์ชันผลิตภัณฑ์หรือชื่อแบรนด์ของ บริษัท ค่าเหล่านี้สามารถเปลี่ยนแปลงได้ตลอดเวลาและเนื่องจากคอมไพเลอร์เผยแพร่ค่าคงที่โค้ดอื่น ๆ ที่คอมไพล์กับไลบรารีของคุณจะต้องคอมไพล์ใหม่เพื่อดูการเปลี่ยนแปลง
จากDotNetPerls :
DLL เมื่อคุณใช้
constฟิลด์หรือการประกาศคอมไพลเลอร์ C # จะฝังconstค่าของตัวแปรลงในรหัส IL โดยตรง ดังนั้นโดยพื้นฐานแล้วจะลบconstเป็นเอนทิตีแยกต่างหากข้อควรระวัง: หากโปรแกรมที่ขึ้นอยู่กับ a
constไม่ได้ทำการคอมไพล์ใหม่หลังจากconstเปลี่ยนค่าแล้วโปรแกรมเหล่านั้นอาจแตก [ เพราะจะยังคงใช้ค่าก่อนหน้านี้ต่อไป ]
ค่าคงที่เป็นค่าคงที่ตามนิยาม
คุณไม่สามารถมีค่าคงที่ ลองอ่านอย่างเดียวแทน const หรือเพียงแค่ปล่อย "static" เนื่องจาก "const" เป็นค่าคงที่โดยนัย
ไม่สามารถแทนที่ค่าคงที่ในโค้ดระหว่างการคอมไพล์ไม่ใช่รันไทม์ดังนั้นจึงไม่มีข้อกำหนดสำหรับนิยามสแตติกเทียบกับอินสแตนซ์
การประกาศค่าคงที่ทั้งหมดเป็นแบบคงที่โดยปริยายและข้อกำหนด C # ระบุว่าห้ามรวม (ซ้ำซ้อน) ของตัวปรับแต่งคงที่ ฉันเชื่อว่านี่คือการหลีกเลี่ยงความสับสนที่อาจเกิดขึ้นได้หากผู้อ่านเห็นค่าคงที่สองค่าตัวหนึ่งประกาศว่าคงที่และอีกค่าหนึ่งไม่ได้พวกเขาสามารถสรุปได้อย่างง่ายดายว่าความแตกต่างในข้อกำหนดส่อถึงความแตกต่างในความหมาย ต้องบอกว่าไม่มีข้อห้ามในการระบุตัวปรับการเข้าถึงซ้ำซ้อนซึ่งเป็นค่าเริ่มต้นซึ่งมีตัวเลือกให้เลือก ตัวอย่างเช่นเมธอด (คอนกรีต) สามารถถูกทำเครื่องหมายอย่างชัดเจนว่าเป็นส่วนตัวแม้ว่าจะเป็นค่าเริ่มต้นก็ตาม กฎดูเหมือนจะไม่มีทางเลือกใด (เช่นการประกาศวิธีการในอินเทอร์เฟซ) ห้ามมิให้มีการปรับเปลี่ยนซ้ำซ้อน หากมีทางเลือกก็อนุญาต