Câu trả lời chính thức
Để nhìn rõ hơn, đây là một bình luận từ Mads Torgersen giải thích quyết định thiết kế này từ bài đăng trên blog của C # 8 :
Chúng tôi quyết định theo dõi Python khi nói đến số học từ đầu đến cuối. 0
chỉ định phần tử đầu tiên (như mọi khi) và ^0
phần tử chiều dài của trò chơi, tức là phần tử bên phải. Bằng cách đó, bạn có được một mối quan hệ đơn giản, trong đó vị trí của một yếu tố từ đầu cộng với vị trí của nó từ đầu bằng với độ dài. các x
trong ^x
là những gì bạn sẽ trừ vào chiều dài nếu bạn muốn thực hiện phép tính cho mình.
Tại sao không sử dụng toán tử dấu trừ ( -
) thay cho ^
toán tử hat ( ) mới? Điều này chủ yếu phải làm với phạm vi. Một lần nữa phù hợp với Python và hầu hết các ngành công nghiệp, chúng tôi muốn các phạm vi của chúng tôi được bao gồm ngay từ đầu, độc quyền ở cuối. Chỉ số bạn vượt qua để nói rằng một phạm vi sẽ đi đến cuối cùng là gì? Trong C #, câu trả lời rất đơn giản: x..^0
đi từ x
cuối đến cuối. Trong Python, không có chỉ mục rõ ràng nào bạn có thể đưa ra: -0
không hoạt động, bởi vì nó bằng 0
, phần tử đầu tiên! Vì vậy, trong Python, bạn phải loại bỏ hoàn toàn chỉ mục kết thúc để thể hiện một phạm vi đi đến cuối : x..
. Nếu kết thúc của phạm vi được tính toán, thì bạn cần nhớ phải có logic đặc biệt trong trường hợp nó xuất hiện 0
. Như trong x..-y
, ở đâuy
đã được tính toán và đi ra 0
. Đây là một phiền toái phổ biến và nguồn gốc của lỗi.
Cuối cùng, lưu ý rằng các chỉ mục và phạm vi là các loại lớp đầu tiên trong .NET / C #. Hành vi của họ không gắn liền với những gì họ được áp dụng, hoặc thậm chí được sử dụng trong một bộ chỉ mục. Bạn hoàn toàn có thể xác định người lập chỉ mục của riêng bạn để lấy Index và một người lập chỉ mục khác Range
- và chúng tôi sẽ thêm các chỉ mục như vậy vào ví dụ Span
. Nhưng bạn cũng có thể có các phương thức lấy phạm vi, ví dụ.
Câu trả lời của tôi
Tôi nghĩ rằng điều này là để phù hợp với cú pháp cổ điển mà chúng ta đã sử dụng để:
value[^1] == value[value.Length - 1]
Nếu nó được sử dụng 0, sẽ gây nhầm lẫn khi hai cú pháp được sử dụng song song. Bằng cách này, nó có tải nhận thức thấp hơn .
Các ngôn ngữ khác như Python cũng sử dụng quy ước tương tự.
[beginInclusive, endExclusive)
. Đó là một quy ước chung.