IT story

Array.Length가 단위가 아닌 정수인 이유

hot-time 2020. 9. 14. 21:39
반응형

Array.Length가 단위가 아닌 정수인 이유 [중복]


Array.Lengthint 아닌 uint. 길이 값이 음수가 될 수 없기 때문에 이것은 나를 괴롭 힙니다.

이것은 또한 int 값을 지정할 때 명시 적으로 캐스팅해야하기 때문에 내 클래스의 길이 속성에 int를 사용하도록 강요했습니다.

그래서 궁극적 인 질문은 : unsigned int ( uint)에 대한 용도가 있습니까? 마이크로 소프트조차도 그것들을 사용하지 않는 것 같습니다.


Unsigned int는 CLS 규격이 아니므로 .NET Framework를 구현하는 언어로 속성 사용을 제한합니다 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가 어떤 시점에서 음수에 추가되고 음의 정수 (2의 보수)에 추가되기 때문에 더 낮은 수준에서 일을 단순화하는 것과 관련이 있다고 생각합니다. , 지저분한 결과가있을 수 있습니다.


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

서명되지 않은 int의 주요 용도는 외부 시스템 (P / Invoke 등)과의보다 쉬운 인터페이스를 제공하고 .NET으로 포팅되는 다양한 언어의 요구 사항을 충족하는 것입니다.


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

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

바이트 배열로 Int32는 2GB의 값을 제공합니다.

참고 URL : https://stackoverflow.com/questions/6301/why-is-array-length-an-int-and-not-an-uint

반응형