문제

이 질문에는 이미 답변이 있습니다.

왜? Array.Length int가 아니라 uint.길이 값은 결코 음수가 될 수 없기 때문에 이것은 나를 (약간) 귀찮게 합니다.

이것은 또한 내 자신의 클래스에서 길이 발전기를 위해 int를 사용해야했습니다. int- 값을 지정할 때 이것은 명시 적으로 캐스팅되어야하기 때문입니다 ...

따라서 궁극적인 질문은 다음과 같습니다.unsigned int(uint)?Microsoft조차도 이를 사용하지 않는 것 같습니다.

도움이 되었습니까?

해결책

Unsigned int는 CLS 규격이 아니므로 속성 사용을 구현하는 언어로 제한합니다. UInt.

여기를 보아라:

프레임워크 1.1

.NET Framework 클래스 라이브러리 소개

프레임워크 2.0

.NET Framework 클래스 라이브러리 개요

다른 팁

많은 이유:

  • uint는 CLS와 호환되지 않으므로 이에 의존하는 내장 유형(배열)을 만드는 것은 문제가 될 수 있습니다.
  • 원래 설계된 런타임에서는 2GB 이상의 메모리를 차지하는 힙의 개체를 금지합니다.이 제한보다 작거나 같은 최대 크기의 배열은 new byte[int.MaxValue]가 되므로 양수이지만 잘못된 배열 길이를 생성할 수 있다는 것은 사람들에게 당혹스러울 것입니다.
  • 역사적으로 C#은 C 및 C++로부터 구문과 규칙의 대부분을 상속받았습니다.이러한 배열에서는 단순히 포인터 연산이므로 음수 배열 인덱싱이 가능합니다(일반적으로 불법적이고 위험하지만).많은 기존 코드에서는 배열 인덱스가 서명되었다고 가정하므로 이것이 요인이 되었을 것입니다.
  • 관련 참고 사항에서 C/C++의 배열 인덱스에 부호 있는 정수를 사용한다는 것은 이러한 언어 및 관리되지 않는 함수와의 상호 운용성이 어쨌든 그러한 상황에서 int를 사용해야 한다는 것을 의미하며, 이는 불일치로 인해 혼란스러울 수 있습니다.
  • BinarySearch 구현(많은 알고리즘의 매우 유용한 구성 요소)은 int의 음수 범위를 사용하여 값을 찾을 수 없음을 나타내는 기능에 의존합니다. 그리고 정렬을 유지하기 위해 해당 값을 삽입해야 하는 위치입니다.
  • 배열에서 작업할 때 기존 인덱스의 음수 오프셋을 사용하려는 경우가 많습니다.단위를 사용하여 배열의 시작 부분을 지나갈 수 있는 오프셋을 사용한 경우 랩 어라운드 동작으로 인해 인덱스가 합법적일 수 있습니다(양수라는 점에서).int를 사용하면 결과가 불법이 됩니다(그러나 런타임이 유효하지 않은 메모리를 읽는 것을 방지하므로 안전합니다).

Array.Length가 부호가 없는 경우 Array.Length가 음수에 추가되고 음수 int(2의 보수)에 추가되기 때문에 더 낮은 수준의 작업을 단순화하는 것과도 관련이 있을 수 있다고 생각합니다. , 지저분한 결과가 있을 수 있습니다.

"궁극적인 질문"에 대해 아무도 답을 제공하지 않은 것 같습니다.

저는 unsigned int의 주요 용도가 외부 시스템(P/Invoke 등)과의 더 쉬운 인터페이스를 제공하고 .NET으로 포팅되는 다양한 언어의 요구 사항을 충족하는 것이라고 생각합니다.

일반적으로 부호 없는 값이 명시적으로 필요하지 않은 한 정수 값은 부호가 있습니다.그것은 단지 그들이 사용되는 방식입니다.나는 그 선택에 동의하지 않을 수도 있지만, 그것이 바로 그런 방식입니다.

당분간은 오늘날의 일반적인 메모리 제약으로 인해 배열 또는 유사한 데이터 구조에 UInt32 길이가 필요한 경우 다른 데이터 구조를 고려해야 합니다.

바이트 배열을 사용하면 Int32는 2GB의 값을 제공합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top