[C#] C # 8 어레이 슬라이싱 기능의 새 hat-operator 인덱스가 0에서 시작하지 않는 이유는 무엇입니까?

C # 8.0은 편리한 배열 배열 방법을 소개합니다 ( 공식 C # 8.0 블로그 게시물 참조) .

배열의 마지막 요소에 액세스하는 구문은 다음과 같습니다.

int value[] = { 10, 11, 12, 13 };

int a = value[^1]; // 13
int b = value[^2]; // 12

요소에 뒤로 액세스하기위한 인덱싱이 0이 아닌 1에서 시작하는 이유가 궁금합니다. 이에 대한 기술적 이유가 있습니까?



답변

공식 답변

가시성을 높이기 위해 Mads TorgersenC # 8 블로그 게시물 에서이 디자인 결정에 대해 설명합니다 .

우리는 시작부터 끝까지의 산술에 관해서 파이썬을 따르기로 결정했습니다. 0 첫 번째 요소 (항상 ^0 그러함 )와 “길이”요소, 즉 끝에서 오른쪽 요소를 지정합니다  . 이렇게하면 요소의 위치와 시작 위치가 길이와 같은 간단한 관계를 얻을 수 있습니다. x 인은  ^x 당신이 수학을 직접 수행했던 경우는 길이에서 제외했을 것입니다.

-새 모자 ( ^) 연산자 대신 빼기 ( )를 사용하지 않습니까? 이것은 주로 범위와 관련이 있습니다. 파이썬과 대부분의 업계와 마찬가지로, 우리는 범위가 처음에는 포함되고 끝에는 독점적이기를 원합니다. 범위가 끝까지 가야한다고 말하는 지수는 무엇입니까? C #에서는 대답이 간단합니다.  끝에서 끝까지 x..^0갑니다  x. 파이썬에는 당신이 줄 수있는 명시적인 인덱스 -0가 없습니다 : 0첫번째 요소와 같기 때문에 작동하지 않습니다 ! 따라서 파이썬에서는 끝까지가는 범위를 나타 내기 위해 끝 색인을 완전히 꺼 두어야합니다 x... 범위의 끝이 계산되면에 나오는 경우를 대비하여 특별한 논리가 있어야합니다 0. 마찬가지로 x..-y, 어디y계산되어 나왔습니다 0. 이것은 일반적인 성 가시고 버그의 원인입니다.

마지막으로, 인덱스와 범위는 .NET / C #의 첫 번째 클래스 유형입니다. 그들의 행동은 그들이 인덱서에 적용되거나 심지어 인덱서에 사용되는 것에 묶여 있지 않습니다. 당신은 완전히 지수와 소요 다른 소요 자신의 인덱서를 정의 할 수 있습니다 Range– 우리는 예를 들어, 그러한 인덱서를 추가하는 겁니다  Span. 그러나 예를 들어 범위를 취하는 메소드를 가질 수도 있습니다.

내 대답

나는 이것이 우리가 사용하는 고전적인 구문과 일치한다고 생각합니다.

value[^1] == value[value.Length - 1]

0을 사용하면 두 구문을 나란히 사용할 때 혼동됩니다. 이런 식으로 인지 부하 가 낮습니다 .

파이썬과 같은 다른 언어도 같은 규칙을 사용합니다.


답변