Jawaban resmi
Untuk visibilitas yang lebih baik, berikut adalah komentar dari Mads Torgersen yang menjelaskan keputusan desain ini dari posting blog C # 8 :
Kami memutuskan untuk mengikuti Python dalam hal aritmatika dari-awal dan dari-akhir. 0
menetapkan elemen pertama (seperti biasa), dan ^0
elemen "length'th", yaitu elemen yang tepat dari akhir. Dengan begitu Anda mendapatkan hubungan yang sederhana, di mana posisi elemen dari awal ditambah posisinya dari ujung sama dengan panjangnya. yang x
di ^x
adalah apa yang Anda akan dikurangi dari panjang jika Anda telah melakukan matematika sendiri.
Mengapa tidak menggunakan operator minus ( -
) sebagai ganti ^
operator topi baru ( )? Ini terutama berkaitan dengan rentang. Sekali lagi sesuai dengan Python dan sebagian besar industri, kami ingin rentang kami inklusif pada awalnya, eksklusif pada akhirnya. Berapakah indeks yang Anda berikan untuk mengatakan bahwa rentang harus sampai akhir? Dalam C # jawabannya sederhana: x..^0
mulai dari x
akhir. Dalam Python, tidak ada indeks eksplisit yang dapat Anda berikan: -0
tidak berfungsi, karena sama dengan 0
, elemen pertama! Jadi dengan Python, Anda harus meninggalkan indeks akhir off sepenuhnya untuk mengekspresikan berbagai yang masuk sampai akhir: x..
. Jika akhir rentang dihitung, maka Anda harus ingat untuk memiliki logika khusus jika itu keluar 0
. Seperti dalam dihitung dan keluar kex..-y
manay
0
. Ini adalah gangguan umum dan sumber bug.
Akhirnya, perhatikan bahwa indeks dan rentang adalah tipe kelas pertama di .NET / C #. Perilaku mereka tidak terikat pada apa yang mereka terapkan, atau bahkan untuk digunakan dalam pengindeks. Anda dapat benar-benar mendefinisikan pengindeks Anda sendiri yang mengambil Indeks dan satu lagi yang mengambil Range
- dan kami akan menambahkan pengindeks tersebut untuk misalnya Span
. Tetapi Anda juga dapat memiliki metode yang mengambil rentang, misalnya.
Jawabanku
Saya pikir ini cocok dengan sintaksis klasik yang biasa kita gunakan:
value[^1] == value[value.Length - 1]
Jika menggunakan 0, itu akan membingungkan ketika kedua sintaks digunakan berdampingan. Dengan cara ini memiliki muatan kognitif yang lebih rendah .
Bahasa lain seperti Python juga menggunakan konvensi yang sama.
[beginInclusive, endExclusive)
. Itu adalah konvensi umum.