2009-02-09 10 views
14

C#의 참조는 가비지 수집된다는 점을 제외하면 C++의 참조와 매우 유사합니다.왜 C#은 C++과 비슷한 const를 제공하지 않습니까?

  1. 회원 기능 const 표시 : C# 컴파일러는 다음과 같은 지원하기 위해

    왜 그때 그렇게 어려운 그것입니다.

  2. const으로 표시된 데이터 유형 (문자열 제외)을 통해 const 멤버 함수 만 호출 할 수 있습니까?

저는 C#이 이것을 지원한다면 정말 유용 할 것이라고 믿습니다. 그 중 하나는 C# 프로그래머가 개인 데이터에 대한 알몸 참조를 반환하는 것 (적어도 내 직장에서 본 것)이 실제로 널리 퍼진 게이를 포기하는 데 도움이됩니다.

이미 C#에서 누락 된 것이 있습니까? (나는 readonlyconst 키워드에 대해 알고 있지만 실제로는 위의 목적에 부합하지 않는다.)

답변

17
나는 몇 가지 구체적인 이유, 어떤 이론적 인 이유가 의심

:

  • 는 const와는 객체 또는 참조에 적용해야는? 그것이 참조에 있다면, 이것은 컴파일시에만 또는 참조 자체 내에 조금 있어야합니까? 후드 아래에 동일한 객체 바이올린에 비 const 참조가있는 다른 것을 사용할 수 있습니까?
  • C++에서 가능한 한 멀리 캐스팅 할 수 있습니까? 이것은 관리 플랫폼에서 원하는 것과 같지 않지만 ... C++에서 의미가있는 모든 시간은 어떨까요?
  • 선언문에 여러 유형이 포함되어있을 때 구문이 복잡해집니다. 배열, 제네릭 등을 생각하면 어떤 비트가 const인지 정확히 알아 내기가 어려울 수 있습니다.
  • 멀리 던져 넣을 수없는 경우 모두가 올바르게 작성해야합니다.. 즉, .NET Framework 유형 및 다른 모든 타사 라이브러리가 모두 올바른 작업을 수행해야하거나 코드가 미묘한 문제로 인해 올바른 작업을 수행 할 수없는 불쾌한 상황이 남아 있습니다. constness.

이 지원되지 않을 수있는 이유의 측면에서 큰 문제가있다 지금하지만 :

  • 역 호환성 : 모든 라이브러리가 올바르게 마이그레이션 될 수있는 방법은 그것을 만드는, 없다 꽤 많이 쓸모 :(

나는 const와 지표의 일종을 가지고 유용하다고 동의하지만, 난 두려워, 그것은 일어나고 볼 수 없습니다.

EDIT : 자바 커뮤니티에서 이러한 격렬한 논쟁이있었습니다. 흥미로운 사실을 발견 할 수있는 relevant bug에 대한 논평이 많이 있습니다.

+0

감사합니다. 그것은 밝다. –

0

질문은 C#에서 constness가 필요한가요?

  1. JITter는 주어진 메소드가 객체 자체에 영향을 미치지 않으며 대응하는 최적화를 자동으로 수행한다는 것을 알고 있습니다.

  2. (어쩌면 의해? callvirt 대신 call 발광) 나는 우리가 const와의 프로의 대부분이 관련 성능 때문에, 당신은 포인트 1.

에 결국, 그 필요 확실하지 않다 그 외에도 C#에는 readonly 키워드가 있습니다.

+1

"대부분의 const의 장점은 성능과 관련이 있습니다"라는 주장에 동의하지 않습니다. 대부분은 정확성과 유지 보수성과 관련 있다고 말하고 싶습니다. –

+2

JITter의 편의를 위해서가 아니라 프로그래머를위한 것입니다. C++에서 const 객체를 변경하려고하면 컴파일러에서 오류가 발생합니다. 그래서 예를 들어, 내 메서드에서 const 참조를 반환 할 수 있습니다. C#에서는 모두 외부의 누군가가 변경할 수있는 참조를 반환하는 것처럼 보입니다. 위험한! –

+0

@ 프레드릭 : 정확하게 :) –

6

Jon이 이미 다루었 으면 (물론) const의 정확성은 나타나는 것처럼 간단하지 않습니다. C++은 한 가지 방법입니다. D는 또 다른 (틀림없이 더 정확하고 유용한) 방법입니다. C#은 그걸로 부끄럽지 만, 당신이 발견 한 것처럼 대담한 것을하지는 않습니다.

그렇긴해도 나는 Jon의 "이론적 인 이유"중 많은 부분이 D 모델에서 해결되었다고 생각한다.

D (2.0)에서 const는 완전히 전이 적이라는 점을 제외하면 C++과 매우 유사합니다 (포인터에 적용된 const가 가리키는 객체, 객체의 모든 멤버, 객체의 포인터, 객체 그들은 등등을 지적했다.) 그러나 이것은 만이 const로 선언 된 변수에서 적용된다는 것을 명시하고있다. (그래서 당신이 이미 const가 아닌 객체를 가지고 있고 그것에 const 포인터를 가져 간다면, const가 아닌 변수는 여전히 상태를 변경).

D는 개체 자체에 적용되는 다른 키워드 - 불변성을 도입합니다. 즉, 초기화 된 상태는 아무 것도 변경할 수 없습니다.

이 배열의 장점은 const 메서드가 const 및 invariant 개체를 모두 받아 들일 수 있다는 것입니다. 불변 객체는 함수 세계의 빵과 버터이기 때문에 const 메서드는 변경 가능한 객체와 함께 사용될 수 있지만 기능적 의미에서는 "순수"로 표시 될 수 있습니다.

다시 돌아 오는 길 - 저는 우리가 이제 const (그리고 invariant)를 사용하는 최선의 방법을 이해하는 (사기꾼의 후반부) 경우라고 생각합니다. 닷넷은 처음에는 일이 더 어렴풋 할 때 정의되었으므로 지나치게 커지지 않았으며 이제는 갱신하기에는 너무 늦었습니다.

내가 :-)

5

Mr. Heljsberg 불구하고, C# 언어의 설계자는 이미이 질문에 대답했다, 닷넷 VM에 D 실행의 포트를보고 싶어요 :

http://www.artima.com/intv/choicesP.html

+0

흥미 롭다. 나는 그것을 보지 못했다. 내 생각에 기능적 관점 (내 대답에 나와있는 것처럼)은 가치가 있다고 생각한다. – philsquared

2

향후 버전의 C#에 변경되지 않는 형식이 추가되면 나는 놀라지 않을 것입니다. C# 3.0에서는 이미 그 방향으로 움직였습니다.

예를 들어, 익명 형식은 변경할 수 없습니다.

필자는 병렬 처리를 수용하도록 설계된 확장의 결과로 불변성 팝업이 점점 더 많이 나타날 것이라고 생각합니다.