Offizielle Antwort
Zur besseren Sichtbarkeit hier ein Kommentar von Mads Torgersen , der diese Entwurfsentscheidung aus dem C # 8-Blogbeitrag erläutert :
Wir haben uns entschieden, Python zu folgen, wenn es um die Arithmetik von Anfang bis Ende geht. 0
bezeichnet das erste Element (wie immer) und ^0
das "Länge" -Element, dh das Element direkt am Ende. Auf diese Weise erhalten Sie eine einfache Beziehung, bei der die Position eines Elements vom Anfang plus seine Position vom Ende der Länge entspricht. Das x
In ^x
ist das, was Sie von der Länge abgezogen hätten, wenn Sie die Mathematik selbst durchgeführt hätten.
Warum nicht das Minuszeichen ( -
) anstelle des neuen ^
Operators hat ( ) verwenden? Dies hat vor allem mit Reichweiten zu tun. Wieder im Einklang mit Python und den meisten Branchen möchten wir, dass unsere Sortimente am Anfang inklusive und am Ende exklusiv sind. Welchen Index geben Sie an, um zu sagen, dass ein Bereich bis zum Ende reichen soll? In C # ist die Antwort einfach: x..^0
geht von x
bis zum Ende. In Python gibt es keinen expliziten Index, den Sie angeben können: Funktioniert -0
nicht, da er 0
dem ersten Element entspricht! In Python müssen Sie also den Endindex vollständig weglassen, um einen Bereich auszudrücken, der bis zum Ende reicht : x..
. Wenn das Ende des Bereichs berechnet wird, müssen Sie daran denken, eine spezielle Logik zu haben, falls dies herauskommt 0
. Wie in x..-y
, woy
wurde berechnet und kam heraus 0
. Dies ist ein häufiges Ärgernis und eine Fehlerquelle.
Beachten Sie schließlich, dass Indizes und Bereiche in .NET / C # erstklassige Typen sind. Ihr Verhalten ist nicht an das gebunden, worauf sie angewendet werden oder sogar in einem Indexer verwendet werden sollen. Sie können Ihren eigenen Indexer, der Index verwendet, und einen anderen, der Index verwendet, vollständig definieren Range
- und wir werden solche Indexer z Span
. Sie können aber auch Methoden verwenden, die beispielsweise Bereiche annehmen.
Meine Antwort
Ich denke, dies entspricht der klassischen Syntax, die wir gewohnt sind:
value[^1] == value[value.Length - 1]
Wenn 0 verwendet würde, wäre es verwirrend, wenn die beiden Syntaxen nebeneinander verwendet würden. Auf diese Weise hat es eine geringere kognitive Belastung.
Andere Sprachen wie Python verwenden dieselbe Konvention.
[beginInclusive, endExclusive)
. Es ist eine übliche Konvention.