2009-05-09 8 views
21

C#이 같은 줄에 const와 static을 허용하지 않는 이유는 무엇입니까? Java에서 필드를 '정적'으로 선언하고 '최종'을 상수로 사용하도록 선언해야합니다. C#에서는 const를 final로 선언하지 않는 이유는 무엇입니까?C#이 같은 줄에 const와 static을 허용하지 않는 이유는 무엇입니까?

Java에서 명시 적으로 선언되었는지 여부에 관계없이 모든 인터페이스는 공개 및 추상입니다. const가 사실상 정적 인 것은 아닌가? C#이 일을 왜하지?

+0

. 그렇다면 왜 걱정할 것입니까! ;) –

+0

B/c 지금은 궁금합니다. =) 본질적으로 진실임을 명시 적으로 밝히지 만 컴파일 오류가 발생하는 이유를 이해하지 못합니다. – Cuga

+0

아마도 Java가 상수를 직접 지원하지 않기 때문에 정적 상수를 사용하여 상수를 구현해야하는 이유가 여기 있습니다. 반면 C#의 const는 Greg에서 언급 한 것처럼 정적이며 컴파일 타임에 설정됩니다. 어떤 사람들은 런타임에 값을 설정할 수있는 정적 읽기 전용을 C#에서 혼동합니다. – jasonco

답변

37

const정적은 실제로 다른 것들, 다른 저장 메커니즘, 다른 초기화를 의미합니다. 정적은 읽기/쓰기이므로 저장소에 할당 된 메모리가 있어야하며 런타임에 초기화해야합니다. 정적 인은 리터럴 값 또는 표현식으로 초기화 할 수 있습니다. 반대로 const은 변경할 수 없으므로 컴파일 시간 상수 (일반적으로 리터럴 값 또는 컴파일 타임에 완전히 평가할 수있는 식)으로 초기화해야합니다. 이 값은 컴파일 타임에 알려 지므로 생성 된 코드에 직접 포함될 수 있으므로 런타임에 할당 할 스토리지가 필요하지 않습니다.

+0

사실, const 및 static은 다른 것을 의미합니다. 그러나 'const'와 'static final'... 거기에 어떤 차이가 있습니까? – Cuga

+0

질문은 C#과 관련이 있습니다. C#에는 '최종'키워드가 없습니다. –

+0

원래 질문은 '정적'vs '정적 최종'(정적이 아니기 때문에 둘 다 '쓰기'권한이 거부 됨)이지만, 메모리 할당이나이 행의 어떤 것이 이유 여야한다는 확신을 가졌습니다. – Cuga

22

본질 상 상수는 이며, 이는 중복 될 수 있으므로입니다.

+0

그래,하지만 말했듯이 .. 자바는 당신이 'public'과 'abstract'로 인터페이스를 선언하도록 해준다. 고유 한 것이므로 오류가 아닙니다. 그렇다면 C#에서 고유 한 것을 명시 적으로 나타내면 오류가있는 이유는 무엇입니까? – Cuga

+9

일반적으로 불필요한 선택을 줄이는 것이 좋습니다. – Sake

+1

나는 그것을 줄 것이다. 나는 당신의 코멘트가 지금까지 최고의 답변이라고 생각합니다. – Cuga

1

고유 한 수정자를 허용하거나 필요하지 않으므로 혼동을 일으킬 수 있습니다.

static const int A = 3 
const int B = 5 

을 보면 2 가지 종류의 상수라고 생각할 수 있습니다.
심지어 VB 2008 (원하는 경우 매우 자세한 수 있습니다) 허용하지 않습니다.

+0

그게 이유는 아니지만 (혼란 스러울지도 모르지만). 예를 들어 필드를 선언하고 액세스 수정자를 제공하지 않으면 public, private, static, internal 중 무엇입니까? 기본값은 private이지만 명시 적으로 선언 할 필요는 없습니다. 정적 및 const를 함께 사용할 수없는 이유는 서로 다른 저장 메커니즘을 내포하므로 상호 배타적이기 때문입니다. –

3

C# const implies static하지만, C#을 키워드 readonly 자바의 최종 키워드에 해당하는 것이 사실이다.

그래서, 사실, C 번호는 C#에서 정적 읽기 전용이다하는 CONST 최종 수 있습니다.

+1

"정적 읽기 전용"은 "const"와 동일하지 않습니다. 상수는 그대로 컴파일됩니다. 정적 읽기 전용은 원래 위치에서 참조됩니다. 값이 미래에 변경 될 수 있거나 심지어 상황이 바뀔 때 읽기 전용으로 사용해야합니다. 진정으로 일정하고 변경되지 않는다면 (예 : Natural Log, Pi 등) const는 좋은 선택입니다. "public static readonly"로 더 좋을 수도 있습니다. –

+0

죄송합니다. Java에서 "static final"은 C#의 "정적 읽기 전용"과 같습니다 (대략적으로). – LWoodyiii

9

로서 전에, 자바 정적 최종가 C에서 # 정적 판독 전용와 동일했다. 사실,이 멤버는 정적이며 내용을 변경할 수 없다고 말하고 있습니다. 또한 두 경우 모두 정적 생성자의 값을 지정할 수 있습니다.

그러나 const은 C#과 완전히 다른 것입니다. 그것은 C (DEFINE 지시문)의 상수 선을 따르지만 OOP를 염두에두고 작성되었습니다. 상수이기 때문에 정적입니다. 모든 인스턴스는 같은 값을 가진이 상수를 가지며 생성자는 설정할 수 없습니다. 인스턴스를 만들지 않고도 상수에 액세스하고 싶을 수도 있습니다. 당신이 그것에 대해 생각할 때 비 정적 상수는 단지 이해가되지 않습니다. 거의 상수는 객체의 일부가 아니라는 것을 알 수 있습니다. 단지 상수를 강력한 이름으로 사용하기 위해서입니다.

Java에는 const에 해당하는 것이 없습니다. 정적 최종DEFINE과 동일하지만 그 정도가 모호합니다.완전히 다른 메커니즘이지만 코드의 최종 결과는 동일하지만 코드 유지 관리가 쉽고 가독성이 뛰어납니다.

C#에서 정적 멤버로 간주하지 않으므로 정적 멤버로 생각하면 안됩니다. OOP 버전 DEFINE으로 생각하십시오. 캡슐화를 고려할 때 최종읽기 전용 필드는 실수로 값이 변경되는 것을 방지하기위한 것입니다. 그리고 그것은 저에게 끊임없이 들리지 않습니다.

Sumary =

  • 최종 읽기 전용
  • 정적 정적 = 최종 읽기 전용
  • N/A = CONST 난 당신이 다시 Jave을 교환했다 생각
관련 문제