Mengapa saya tidak dapat memiliki "public const const statis S =" stuff "; di Kelas saya?

321

Ketika mencoba mengkompilasi kelas saya, saya mendapatkan kesalahan:

Konstanta 'NamespaceName.ClassName.CONST_NAME'tidak dapat ditandai statis.

di garis:

public static const string CONST_NAME = "blah";

Saya bisa melakukan ini sepanjang waktu di Jawa. Apa yang saya lakukan salah? Dan mengapa tidak membiarkan saya melakukan ini?

jjnguy
sumber

Jawaban:

583

Sebuah constbenda selalu static.

Joel Coehoorn
sumber
2
const membuat variabel konstan dan tidak dapat diubah.
Samuel
6
@jinguy: const secara inheren berarti statis - jika Anda memiliki const, itu sudah statis, dan karena itu statis tidak perlu atau tidak dapat ditentukan.
John Rudy
8
@ jjnguy: Kenapa? readonly sebenarnya lebih fleksibel daripada final Java untuk variabel - Anda dapat mengaturnya sebanyak yang Anda suka di konstruktor, tetapi tidak di tempat lain. Itu bisa sangat berguna.
Jon Skeet
67
Konstanta disejajarkan pada waktu kompilasi dan tidak ada dalam objek tipe statis saat runtime. Statika tidak digarisbawahi dan hidup di dalam objek tipe. Saya menambahkan ini hanya karena tidak ada yang disebutkan perbedaan ...
3
Mereka masih ada pada waktu eksekusi - Anda bisa mendapatkannya dengan refleksi, misalnya (dengan GetField).
Jon Skeet
32

Anggota const dianggap statis oleh kompiler, serta menyiratkan semantik nilai konstan, yang berarti referensi ke konstanta dapat dikompilasi ke dalam kode menggunakan sebagai nilai dari anggota konstan, bukan referensi ke anggota.

Dengan kata lain, anggota konst yang berisi nilai 10, dapat dikompilasi ke dalam kode yang menggunakannya sebagai angka 10, alih-alih referensi ke anggota const.

Ini berbeda dari bidang hanya baca statis, yang akan selalu dikompilasi sebagai referensi ke bidang.

Catatan, ini adalah pra-JIT. Ketika JIT'ter mulai dimainkan, mungkin mengkompilasi keduanya ke dalam kode target sebagai nilai.

Lasse V. Karlsen
sumber
Poin yang sangat penting, bahwa kode yang dikompilasi menganggap nilai konstan tidak akan berubah di versi masa depan.
PJTraill
6

C # constadalah hal yang persis sama dengan Java final, kecuali itu benar-benar selalu static. Menurut pendapat saya, itu tidak benar-benar perlu untuk constvariabel menjadi non- static, tetapi jika Anda perlu mengakses constvariabel non static-ly, Anda dapat melakukan:

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;
    }    
}

Nah, sekarang saya menyadari pertanyaan ini ditanyakan 4 tahun yang lalu, tetapi karena saya menempatkan sekitar 2 jam kerja, yang terdiri dari mencoba berbagai macam cara menjawab dan memformat kode, ke dalam jawaban ini, saya masih mempostingnya. :)

Tapi, sebagai catatan, saya masih merasa agak konyol.

Meowmaritus
sumber
4
Sejauh yang saya tahu, Java finalberperilaku persis seperti C # readonly, dan tidak suka constsama sekali.
Ben Voigt
@ jjnguy Terima kasih atas hasil editnya; Saya tidak benar-benar tahu mengapa saya memilih kata-kata aslinya.
Meowmaritus
6

Dari MSDN: http://msdn.microsoft.com/en-us/library/acdd6hb7.aspx

... Juga, sementara bidang const adalah konstanta waktu kompilasi , bidang readonly dapat digunakan untuk konstanta runtime ...

Jadi menggunakan static di bidang const seperti mencoba membuat statis yang didefinisikan (dengan #define) di C / C ++ ... Karena diganti dengan nilainya dalam waktu kompilasi tentu saja ia dimulai sekali untuk semua instance (= statis) .

uriel
sumber
2

const mirip dengan static kita dapat mengakses kedua varables dengan nama kelas tetapi beda adalah variabel statis dapat dimodifikasi dan const tidak bisa.

soujanya
sumber