다른 좋은 답변 외에도 C 스타일의 constness를 C #에 넣지 않는 또 다른 이유를 추가하겠습니다. 당신은 말했다 :
메서드에서 상태가 변경되지 않도록 매개 변수를 const로 표시합니다.
const가 실제로 그렇게했다면 그것은 좋을 것입니다. Const는 그렇게하지 않습니다. const는 거짓말입니다!
Const는 실제로 사용할 수 있다는 보장을 제공하지 않습니다. const 일을 취하는 메소드가 있다고 가정하십시오. 두 명의 코드 작성자가 있습니다. 호출자를 작성하는 사람 과 수신자를 작성하는 사람 입니다. 피 호출자의 작성자는 메소드가 const를 취하도록 만들었습니다. 두 저자는 객체에 대해 무엇이 변하지 않는다고 가정 할 수 있습니까?
아무것도. 피 호출자는 const를 캐스트하고 객체를 변경할 수 있으므로 호출자는 const를 취하는 메서드를 호출하는 것이 실제로 변경되지 않는다는 보장 이 없습니다. 마찬가지로 피 호출자는 객체의 내용이 피 호출자의 작업 내내 변경되지 않을 것이라고 가정 할 수 없습니다. 피 호출자 는 const 객체의 비 const 별칭 에 대해 일부 mutating 메서드를 호출 할 수 있으며 이제 소위 const 객체가 변경되었습니다 .
C 스타일 const는 객체가 변경되지 않아 손상된다는 보장을 제공하지 않습니다. 이제 C는 이미 원할 경우 double을 int로 재 해석 할 수있는 약한 유형 시스템을 가지고 있으므로 const에 대해서도 약한 유형 시스템을 가지고 있다는 것은 놀라운 일이 아닙니다. 그러나 C #은 좋은 형식 시스템 을 갖도록 설계되었습니다. "이 변수에는 문자열이 포함되어 있습니다"라고 말하면 변수가 실제로 문자열 (또는 null)에 대한 참조를 포함하는 형식 시스템 입니다. 우리 는 타입 시스템이 거짓말이되는 것을 원하지 않기 때문에 C 스타일의 "const"수정자를 타입 시스템에 넣는 것을 절대 원하지 않습니다 . 코드에 대해 올바르게 추론 할 수 있도록 유형 시스템이 강력 하기를 바랍니다 .
Const in C는 지침입니다 . 그것은 기본적으로 "이것을 변형 시키려하지 않기 위해 나를 믿을 수있다"는 의미입니다. 그것은 타입 시스템 에 있어서는 안됩니다 . 에서 물건 타입 시스템은 해야 사실 당신이하지에 대해 추론 할 수있는 개체에 대한 가이드 라인 의 사용합니다.
자, 오해하지 마십시오. C의 const가 깊이 깨 졌다고해서 전체 개념이 쓸모 없다는 의미는 아닙니다. 내가보고 싶은 것은 C #에서 실제로 정확 하고 유용한 형태의 "const"주석입니다. 이는 인간과 컴파일러 모두가 코드를 이해하는 데 사용할 수 있고 런타임이 자동 병렬화와 같은 작업을 수행하는 데 사용할 수있는 주석입니다. 기타 고급 최적화.
예를 들어, 한 덩어리의 코드 주위에 "상자를 그리고" 컴파일러가 확인할 수있는 방식으로 "이 코드 덩어리가이 클래스의 어떤 필드에도 변형을 수행하지 않는다는 것을 보장 합니다 "라고 말할 수 있다고 상상해보십시오 . 또는 "이 순수한 방법은 개체의 내부 상태를 변경하지만 상자 외부에서 관찰 할 수있는 방식은 변경하지 않습니다."라는 상자를 그립니다. 이러한 객체는 자동으로 안전하게 다중 스레드 될 수 없지만 자동으로 메모 될 수 있습니다 . 풍부한 최적화와 더 깊은 이해를 가능하게하는 코드에 추가 할 수있는 모든 종류의 흥미로운 주석이 있습니다. 약한 C 스타일의 const 주석보다 더 잘할 수 있습니다.
그러나 나는 이것이 단지 추측이라고 강조한다 . 우리는 이런 종류의 기능을 C #의 가상 미래 버전에 넣을 확고한 계획이 없습니다. 이것은 제가보고 싶은 것입니다. 다가오는 멀티 코어 컴퓨팅에 대한 강조가 필요할 수도 있지만, 어떤 식 으로든 C #의 특정 기능 또는 미래 방향에 대한 예측이나 보장으로 해석되어서는 안됩니다.
이제 원하는 것이 "이 매개 변수의 값은 메소드 전체에서 변경되지 않습니다"라는 매개 변수 인 로컬 변수에 대한 주석뿐이라면, 확실히 쉽게 수행 할 수 있습니다. 한 번 초기화되는 "읽기 전용"지역 및 매개 변수와 메서드에서 변경되는 컴파일 타임 오류를 지원할 수 있습니다. "using"문에 의해 선언 된 변수는 이미 그러한 지역입니다. 모든 지역 및 매개 변수에 선택적 주석을 추가하여 "사용"변수처럼 작동하도록 만들 수 있습니다. 우선 순위가 매우 높은 기능이 아니므로 구현 된 적이 없습니다.