클래스에“public static const string S =”stuff”를 사용할 수없는 이유는 무엇입니까?


321

내 클래스를 컴파일하려고 할 때 오류가 발생합니다.

상수 'NamespaceName.ClassName.CONST_NAME'는 정적으로 표시 될 수 없습니다.

라인에서 :

public static const string CONST_NAME = "blah";

Java로 항상이 작업을 수행 할 수 있습니다. 내가 뭘 잘못하고 있죠? 그리고 왜 내가 이것을하지 못하게합니까?

답변:


583

const객체는 항상 static.


2
const는 변수를 일정하게 만들고 변경할 수 없습니다.
Samuel

6
@jinguy : const는 본질적으로 정적을 의미합니다. const가있는 경우 이미 정적이므로 static은 지정할 필요가 없으며 지정할 수 없습니다.
John Rudy

8
@jjnguy : 왜? readonly는 실제로 변수에 대한 Java의 final보다 더 유연합니다. 생성자에서 원하는 횟수만큼 설정할 수 있지만 다른 곳에서는 불가능합니다. 매우 편리 할 수 ​​있습니다.
Jon Skeet

67
Const는 컴파일 타임에 인라인되며 런타임시 정적 유형 객체에 없습니다. 스태틱은 인라인되지 않으며 유형 객체 안에 있습니다. 아무도 차이점을 언급하지 않았기 때문에 이것을 추가합니다 ...

3
그것들은 여전히 ​​실행 시간에 존재합니다-예를 들어 (GetField를 사용하여) 리플렉션으로 얻을 수 있습니다.
Jon Skeet


32

const 멤버는 상수 값 의미를 암시 할뿐만 아니라 컴파일러에 의해 정적으로 간주됩니다. 이는 상수에 대한 참조가 멤버에 대한 참조 대신 상수 멤버의 값으로 사용 코드로 컴파일 될 수 있음을 의미합니다.

즉, 값 10을 포함하는 const 멤버는 const 멤버에 대한 참조 대신 숫자 10으로 사용하는 코드로 컴파일 될 수 있습니다.

이 필드는 정적 읽기 전용 필드와 다르며 항상 필드에 대한 참조로 컴파일됩니다.

이것은 JIT 이전입니다. JIT'ter가 작동하면 둘 다 대상 코드에 값으로 컴파일 될 수 있습니다.


컴파일 된 코드가 상수 값이 향후 버전에서 변경되지 않을 것이라고 가정한다는 점은 매우 중요합니다.
PJTraill December

6

C # constfinal항상을 제외하고 는 Java와 똑같습니다 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 필드에서 static을 사용하는 것은 C / C ++에서 정의 된 (#define으로) static을 만드는 것과 같습니다. 컴파일 타임의 값으로 바뀌므로 모든 인스턴스에 대해 한 번 시작됩니다 (= static) .


2

const는 static과 비슷하지만 클래스 이름으로 두 변수에 모두 액세스 할 수 있지만 diff는 정적 변수를 수정할 수 있고 const는 수정할 수 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.