Resmi cevap
Daha iyi görünürlük için, Mads Torgersen'den C # 8 blog gönderisinden bu tasarım kararını açıklayan bir yorum :
Başlangıçtan ve sondan aritmetik konusunda Python'u takip etmeye karar verdik. 0
ilk elemanı (her zamanki gibi) ve ^0
“uzunluk” elemanını, yani sondan bir sonraki elemanı belirtir. Bu şekilde, bir öğenin başından itibaren konumunun ve sondan konumunun uzunluğa eşit olduğu basit bir ilişki elde edersiniz. x
içinde ^x
hesabı sen kendin yapmış olsaydı sen uzunluğundan çıkarılır olurdu budur.
Neden -
yeni hat ( ^
) operatörü yerine eksi ( ) kullanılmıyor ? Bu öncelikle aralıklarla ilgilidir. Yine Python ve endüstrinin çoğuna uygun olarak, aralıklarımızın başlangıçta kapsayıcı olmasını ve sonunda özel olmasını istiyoruz. Bir aralığın sonuna kadar gitmesi gerektiğini söylemek için geçtiğiniz dizin nedir? C # 'da cevap basit: sonuna x..^0
kadar gider x
. Python'da verebileceğiniz açık bir dizin yoktur: ilk öğeye -0
eşit olduğu için çalışmaz 0
! Yani Python, sonuna kadar giden bir dizi ifade etmek tamamen bitiş dizinini kapalı ayrılmak zorunda: x..
. Aralığın sonu hesaplanırsa, ortaya çıkması durumunda özel mantığa sahip olduğunuzu hatırlamanız gerekir 0
. Olduğu gibi x..-y
, neredey
hesaplandı ve çıktı 0
. Bu yaygın bir sıkıntı ve hata kaynağıdır.
Son olarak, dizinlerin ve aralıkların .NET / C # içindeki birinci sınıf türler olduğunu unutmayın. Davranışları uygulandıkları şeye bağlı değildir, hatta bir indeksleyicide bile kullanılamaz. Dizin'i alan kendi dizinleyicinizi ve bunu alan başka bir dizininizi tamamen tanımlayabilirsiniz. Bu Range
tür dizinleyicileri örn Span
. Ancak, örneğin aralık alan yöntemler de kullanabilirsiniz.
Cevabım
Bunun alışkın olduğumuz klasik sözdizimiyle eşleştiğini düşünüyorum:
value[^1] == value[value.Length - 1]
Eğer 0 kullanılırsa, iki sözdizimi yan yana kullanıldığında kafa karıştırıcı olurdu. Bu şekilde daha düşük bilişsel yüke sahiptir.
Python gibi diğer diller de aynı kuralları kullanır.
[beginInclusive, endExclusive)
. Bu ortak bir sözleşmedir.