Чому я не можу у своєму класі мати "public static const string S =" stuff ";


321

При спробі складання мого класу я отримую помилку:

Константа 'NamespaceName.ClassName.CONST_NAME'не може бути позначена статичною.

на лінії:

public static const string CONST_NAME = "blah";

Я міг це робити весь час на Яві. Що я роблю неправильно? І чому це не дозволяє мені це зробити?

Відповіді:


583

constОб'єкт завжди static.


2
const робить змінну постійною і її неможливо змінити.
Самуїл

6
@jinguy: const по суті означає статичне - якщо у вас є const, воно вже є статичним, а статичне, тому не потрібно і не може бути вказане.
Джон Руді

8
@jjnguy: Чому? readonly насправді є більш гнучким, ніж фінал Java для змінних - ви можете встановити його стільки разів, скільки вам потрібно в конструкторі, але не в іншому місці. Це може бути дуже зручно.
Джон Скіт

67
Конкурси накреслені під час компіляції та відсутні в об'єкті статичного типу під час виконання. Статичні дані не є вкладеними і живуть усередині об'єкта типу. Я додаю це лише тому, що ніхто не згадав різницю ...

3
Вони все ще присутні під час виконання - ви можете отримати на них відображення, наприклад (за допомогою GetField).
Джон Скіт


32

Учасник const компілятором вважається статичним, а також має на увазі семантику постійного значення, а це означає, що посилання на константу можуть бути складені в код використання як значення постійного члена замість посилання на член.

Іншими словами, член const, що містить значення 10, може бути зібраний у код, який використовує його як число 10 замість посилання на член const.

Це відрізняється від статичного поля лише для читання, яке завжди буде складено як посилання на поле.

Зауважте, це перед 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 роки тому, але оскільки я вклав у цю відповідь дві години роботи, що складаються з спроб різного роду відповідей та форматування коду, я все одно публікую його. :)

Але, для запису, я все одно відчуваю себе якось дурним.


4
Наскільки я можу сказати, Java finalповодиться точно так само, як C # readonly, і зовсім не так, як const.
Ben Voigt

@jjnguy Дякую за редагування; Я не знаю, чому я обрав саме таку оригінальну формулювання.
Meowmaritus

6

Від MSDN: http://msdn.microsoft.com/en-us/library/acdd6hb7.aspx

... Також, хоча поле const є постійною часом компіляції , поле readonly може використовуватися для констант виконання ...

Тож використання статики у полях const - це як спроба зробити визначений (з #define) статичний у C / C ++ ... Оскільки він замінюється своїм значенням у час компіляції, звичайно, він ініціюється один раз для всіх екземплярів (= статичний) .


2

const схожий на статичний, ми можемо отримати доступ до обох змінних з назвою класу, але різницею статичні змінні можуть бути змінені, а const не можуть.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.