2010-05-05 5 views
3

uint와 ulong의 기본 컨텍스트가 음수가 될 수없는 값을 나타 내기위한 것이라는 점을 고려하지 않은 것이 이상하다는 것을 알게된 사람이 있습니까?C#에서 체크 된 문맥에서 unsigned int/long이 항상 실행되도록 만들기

그래서 어떤 코드가 그 제약 조건을 위반하려고한다면 자연스러운 동작은 중요한 값 대신에 최대 값을 반환하는 대신 예외를 throw하는 것입니다 (이는 중요한 상태의 데이터를 쉽게 남겨 둘 수 있습니다. 되 돌리는 것은 불가능하다. ..).

클래스/어셈블리에 적용 할 수있는 기존 특성이 있으므로 항상 체크 된 컨텍스트에서 산술 연산을 수행합니까? 나는 자신을 (PostSharp를 사용하는 양상으로) 쓰기를 생각하고 있었지만, 이미 하나가 있다면 좋을 것입니다.

많은 감사,

답변

4

내가 왜 int.MinValue에서 int.MaxValue에 언더 플로보다 더 나은 것으로 0 uint.MaxValue로 가능성에서 언더 플로입니다 ... 여기에 서명 한 사람에 비해 부호없는 정수에 대해 다른 무엇이 표시되지 않는 이유는 무엇입니까?

전체 어셈블리를 검사하여 컴파일하려면 명령 줄이나 Visual Studio에서 /checked (또는 더 명확하게하려면 /checked+)을 사용하고 프로젝트 속성에서 빌드 탭을 찾은 다음 "고급 ..."을 클릭하십시오. . "및"산술 오버플로/언더 플로 확인 "상자를 체크하십시오.

나는 특정 클래스에 대해서만이 작업을 수행 할 방법이 없다고 생각합니다.

+0

은 부호가있는 정수에 대한 귀하의 요점에 완전히 동의합니다.이 언더 플로우 처리의 기본 동작은 이상하게 보입니다. 왜 이런 방식으로 설계 되었습니까? 점검을 통해 전체 어셈블리를 컴파일하는 팁을 주셔서 감사합니다. 정확히 내가 한 것입니다! :-) – theburningmonk

+0

@theburningmonk : 나는 체크 된 구현보다 훨씬 더 나은 성능을 발휘하기 때문에 기본값이 선택되었다고 생각합니다. 해시 코드 계산을 위해 체크되지 않은 블록을 원할 것입니다. 실제로는 크기가 중요하지 않은 비트 패턴입니다. –

관련 문제