Sınıfımda neden “public static const string S =” stuff ”;


321

Sınıfımı derlemeye çalışırken bir hata alıyorum:

Sabit 'NamespaceName.ClassName.CONST_NAME'statik olarak işaretlenemez.

hatta:

public static const string CONST_NAME = "blah";

Bunu Java'da her zaman yapabilirdim. Neyi yanlış yapıyorum? Neden bunu yapmama izin vermiyor?

Yanıtlar:


583

Bir constnesne her zaman vardır static.


2
const değişkeni sabit yapar ve değiştirilemez.
Samuel

6
@jinguy: const, doğal olarak statik anlamına gelir - eğer herhangi bir const'unuz varsa, zaten statiktir ve statiktir, bu nedenle belirtilmesi veya belirtilmesi gerekmez.
John Rudy

8
@jjnguy: Neden? readonly aslında Java'nın değişkenler için son halinden daha esnektir - bunu yapıcıda istediğiniz kadar ayarlayabilirsiniz, ancak başka bir yerde ayarlayamazsınız. Bu çok kullanışlı olabilir.
Jon Skeet

67
Consts derleme zamanında inline edilir ve çalışma zamanında statik tip nesnesinde mevcut değildir. Statikler satır içine alınmaz ve yazım nesnesinin içinde yaşar. Bunu kimse farkından bahsetmediği için

3
Hala uygulama zamanında mevcutlar - onlara yansımayla, örneğin (GetField ile) ulaşabilirsiniz.
Jon Skeet


32

Bir sabit eleman, derleyici tarafından statik olarak kabul edilir ve sabit değer semantiği anlamına gelir; bu, sabite yapılan referansların, üyeye referans yerine sabit üyenin değeri olarak kullanım koduna derlenebileceği anlamına gelir.

Başka bir deyişle, 10 değerini içeren bir const üyesi, const üyesine bir referans yerine, 10 sayısı olarak kullanan koda derlenebilir.

Bu, her zaman alana bir başvuru olarak derlenecek olan statik bir salt okunur alandan farklıdır.

Not, bu JIT öncesi. JIT'ter devreye girdiğinde, her ikisini de hedef kodda değerler olarak derleyebilir.


Çok önemli nokta, derlenmiş kodun gelecekteki bir versiyonda değişmeyeceğini varsayar.
PJTraill

6

C # 'ler constJava ile aynı şeydir final, kesinlikle her zaman hariç static. Kanımca, bir constdeğişkenin olmayan olması gerçekten gerekli değildir static, ancak bir constdeğişkene olmayan bir şekilde erişmeniz gerekiyorsa staticşunları yapabilirsiniz:

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

Şimdi, bu sorunun 4 yıl önce sorulduğunu fark ettim, ancak bu tür cevaplara her türlü farklı cevaplama ve kod biçimlendirme yöntemlerini denemekten oluşan yaklaşık 2 saat çalıştığımdan beri hala gönderiyorum. :)

Ama kayıt için hala kendimi aptal gibi hissediyorum.


4
Anlayabildiğim kadarıyla, Java finaltam olarak C # gibi davranıyor readonlyve hiç de değil const.
Ben Voigt

@jjnguy Düzenleme için teşekkürler; O orijinal ifadeyi neden seçtiğimi gerçekten bilmiyorum.
Meowmaritus

6

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

... Ayrıca, bir const alanı derleme zamanı sabiti olsa da , salt okunur alan çalışma zamanı sabitleri için kullanılabilir ...

Const alanlarında statik kullanmak, C / C ++ 'da tanımlanmış (#define ile) statik yapmaya çalışmak gibidir ... Derleme zamanında değeriyle değiştirildiği için, tüm örnekler için bir kez başlatılır (= statik) .


2

const statiktir, sınıf adıyla her iki değişkene de erişebiliriz, ancak diff statik değişkenler değiştirilebilir ve const olamaz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.