เหตุใดฉันจึงไม่มี“ สิ่งของคงที่สตริงสาธารณะ S =” เนื้อหา "ในชั้นเรียนของฉัน


321

เมื่อพยายามรวบรวมชั้นเรียนของฉันฉันพบข้อผิดพลาด:

ค่าคงที่'NamespaceName.ClassName.CONST_NAME'ไม่สามารถทำเครื่องหมายแบบคงที่ได้

ที่บรรทัด:

public static const string CONST_NAME = "blah";

ฉันสามารถทำสิ่งนี้ได้ตลอดเวลาใน Java ผมทำอะไรผิดหรือเปล่า? และทำไมไม่ให้ฉันทำเช่นนี้?

คำตอบ:


583

วัตถุอยู่เสมอconststatic


2
const ทำให้ตัวแปรคงที่และไม่สามารถเปลี่ยนแปลงได้
ซามูเอล

6
@ Jinguy: const หมายถึงคงที่ - ถ้าคุณมี const ใด ๆ มันคงแล้วและคงไม่จำเป็นต้องเป็นและไม่สามารถระบุได้
John Rudy

8
@jjnguy: เพราะอะไร ที่อ่านได้อย่างเดียวนั้นมีความยืดหยุ่นมากกว่าตัวสุดท้ายของ Java สำหรับตัวแปร - คุณสามารถตั้งค่าได้บ่อยเท่าที่คุณต้องการในตัวสร้าง แต่ไม่ใช่ที่อื่น มันมีประโยชน์มาก
Jon Skeet

67
Consts ถูก inline ณ เวลาที่คอมไพล์และไม่มีอยู่ในวัตถุชนิดสแตติกที่รันไทม์ สถิตไม่ได้อยู่ในและอยู่ภายในวัตถุชนิด ฉันจะเพิ่มนี้เพียงเพราะไม่มีใครกล่าวถึงความแตกต่าง ...

3
พวกเขายังคงปรากฏตัวในเวลาดำเนินการ - คุณสามารถเข้าถึงพวกมันด้วยการสะท้อนตัวอย่าง (ด้วย GetField)
Jon Skeet

98

จากข้อกำหนดภาษา C # (หน้า PDF 287 - หรือหน้า 300 ของ PDF):

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


2
นอกจากนี้ยังมีให้ที่นี่: msdn.microsoft.com/en-us/library/aa645749(VS.71).aspx
Lasse V. Karlsen

32

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

กล่าวอีกนัยหนึ่งสมาชิก const ที่มีค่า 10 อาจถูกรวบรวมเป็นโค้ดที่ใช้เป็นหมายเลข 10 แทนที่จะเป็นการอ้างอิงถึงสมาชิก const

สิ่งนี้แตกต่างจากฟิลด์สแตติกแบบอ่านอย่างเดียวซึ่งจะถูกรวบรวมเป็นการอ้างอิงไปยังฟิลด์

หมายเหตุนี่คือ pre-JIT เมื่อ JIT'ter เข้ามามันอาจรวบรวมทั้งสองอย่างนี้ในโค้ดเป้าหมายเป็นค่า


จุดสำคัญมากที่รหัสที่รวบรวมไว้จะถือว่าค่าคงที่จะไม่เปลี่ยนแปลงในเวอร์ชันในอนาคต
PJTraill

6

C # 's constเป็นสิ่งที่แน่นอนเช่นเดียวกับของ Java ยกเว้นก็อย่างเสมอfinal staticในความคิดของฉันมันไม่จำเป็นจริงๆสำหรับconstตัวแปรที่จะไม่ใช่ - staticแต่ถ้าคุณต้องการเข้าถึงconstตัวแปรที่ไม่ใช่staticคุณสามารถทำได้:

class MyClass
{    
    private const int myLowercase_Private_Const_Int = 0;
    public const int MyUppercase_Public_Const_Int = 0;

    /*        
      You can have the `private const int` lowercase 
      and the `public int` Uppercase:
    */
    public int MyLowercase_Private_Const_Int
    {
        get
        {
            return MyClass.myLowercase_Private_Const_Int;
        }
    }  

    /*
      Or you can have the `public const int` uppercase 
      and the `public int` slighly altered
      (i.e. an underscore preceding the name):
    */
    public int _MyUppercase_Public_Const_Int
    {
        get
        {
            return MyClass.MyUppercase_Public_Const_Int;
        }
    } 

    /*
      Or you can have the `public const int` uppercase 
      and get the `public int` with a 'Get' method:
    */
    public int Get_MyUppercase_Public_Const_Int()
    {
        return MyClass.MyUppercase_Public_Const_Int;
    }    
}

ทีนี้ฉันรู้ว่าคำถามนี้ถูกถามเมื่อ 4 ปีก่อน แต่เนื่องจากฉันใช้เวลาประมาณ 2 ชั่วโมงในการทำงานซึ่งประกอบด้วยการพยายามตอบคำถามและการจัดรูปแบบรหัสที่หลากหลายลงในคำตอบนี้ฉันยังคงโพสต์ไว้ :)

แต่สำหรับบันทึกฉันยังรู้สึกโง่


4
เท่าที่ฉันสามารถบอกได้ Java finalทำงานเหมือน C # readonlyและไม่ชอบconstเลย
Ben Voigt

@jjnguy ขอบคุณสำหรับการแก้ไข; ฉันไม่รู้จริงๆว่าทำไมฉันถึงเลือกถ้อยคำดั้งเดิม
Meowmaritus

6

จาก MSDN: http://msdn.microsoft.com/en-us/library/acdd6hb7.aspx

... นอกจากนี้ในขณะที่เขตข้อมูล const เป็นค่าคงที่รวบรวมเวลาเขตข้อมูลแบบอ่านอย่างเดียวสามารถใช้สำหรับค่าคงที่แบบรันไทม์ ...

ดังนั้นการใช้สแตติกในฟิลด์ const ก็เหมือนกับพยายามสร้างสแตติก (ด้วย #define) ที่กำหนดไว้ใน C / C ++ ... เนื่องจากมันถูกแทนที่ด้วยค่าของมันในการคอมไพล์เวลาแน่นอนว่ามันเริ่มต้นเพียงครั้งเดียวสำหรับอินสแตนซ์ทั้งหมด .


2

const คล้ายกับสแตติกเราสามารถเข้าถึงตัวแปรทั้งสองด้วยชื่อคลาส แต่ diff เป็นตัวแปรสแตติกสามารถแก้ไขได้และ const ไม่สามารถ

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