ค่าคงที่ไม่สามารถทำเครื่องหมายคงที่ได้


96

ฉันพยายามประกาศค่าคงที่ PI ดังนี้:

public static const double PI = Math.PI;

แต่ทำไมฉันถึงได้รับข้อผิดพลาดนี้

The constant 'Calendar.NewCalendar.PI' cannot be marked static

1
เป็นไปได้ที่จะทำสำเนาstackoverflow.com/questions/408192/…
himanshupareek66

คำตอบ:


198

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เปลี่ยนค่าแล้วโปรแกรมเหล่านั้นอาจแตก [ เพราะจะยังคงใช้ค่าก่อนหน้านี้ต่อไป ]


15

ค่าคงที่เป็นค่าคงที่ตามนิยาม


สิ่งนี้นำไปใช้กับ "สุดท้าย" ใน java ด้วยหรือไม่
Basheer AL-MOMANI

@ BasheerAL-MOMANI: ไม่ขั้นสุดท้ายไม่สามารถเปลี่ยนแปลงได้หลังจากการเรียกตัวสร้าง ไม่มีอะไรมาก.
juergen

9

คุณไม่สามารถมีค่าคงที่ ลองอ่านอย่างเดียวแทน const หรือเพียงแค่ปล่อย "static" เนื่องจาก "const" เป็นค่าคงที่โดยนัย


4

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


3

การประกาศค่าคงที่ทั้งหมดเป็นแบบคงที่โดยปริยายและข้อกำหนด C # ระบุว่าห้ามรวม (ซ้ำซ้อน) ของตัวปรับแต่งคงที่ ฉันเชื่อว่านี่คือการหลีกเลี่ยงความสับสนที่อาจเกิดขึ้นได้หากผู้อ่านเห็นค่าคงที่สองค่าตัวหนึ่งประกาศว่าคงที่และอีกค่าหนึ่งไม่ได้พวกเขาสามารถสรุปได้อย่างง่ายดายว่าความแตกต่างในข้อกำหนดส่อถึงความแตกต่างในความหมาย ต้องบอกว่าไม่มีข้อห้ามในการระบุตัวปรับการเข้าถึงซ้ำซ้อนซึ่งเป็นค่าเริ่มต้นซึ่งมีตัวเลือกให้เลือก ตัวอย่างเช่นเมธอด (คอนกรีต) สามารถถูกทำเครื่องหมายอย่างชัดเจนว่าเป็นส่วนตัวแม้ว่าจะเป็นค่าเริ่มต้นก็ตาม กฎดูเหมือนจะไม่มีทางเลือกใด (เช่นการประกาศวิธีการในอินเทอร์เฟซ) ห้ามมิให้มีการปรับเปลี่ยนซ้ำซ้อน หากมีทางเลือกก็อนุญาต

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