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 Torgersen 의 C # 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을 사용하면 두 구문을 나란히 사용할 때 혼동됩니다. 이런 식으로 인지 부하 가 낮습니다 .
파이썬과 같은 다른 언어도 같은 규칙을 사용합니다.