[解決済み] C# 8の配列スライシング機能による新しいハットオペレーターインデックスは、なぜ0から始まらないのでしょうか?
質問
C# 8.0 では、配列をスライスする便利な方法が導入されています。 C# 8.0公式ブログポスト .
配列の最後の要素にアクセスするための構文は次のとおりです。
var value = new[] { 10, 11, 12, 13 };
int a = value[^1]; // 13
int b = value[^2]; // 12
気になるのは、要素を逆からアクセスする際のインデックスが、0ではなく1から始まっていることでしょうか。技術的な理由があるのでしょうか?
解決方法は?
公式回答
見やすくするために、以下のようなコメントがあります。 マッズ・トルガーセン から、この設計上の決定を説明する。 C# 8のブログ記事 :
フロムビギンとフロムエンドの演算に関しては、Pythonに従うことにしました。
0
は最初の要素を指定し(いつものように)、そして^0
は、"length'th" 要素、すなわち、最後からすぐの要素です。こうすることで、ある要素の始まりからの位置と終わりからの位置を足したものが長さになるという単純な関係を得ることができます。x
で^x
は、自分で計算した場合、長さから差し引かれるものです。なぜ、マイナス(
-
) の代わりに、新しい帽子 (^
) 演算子を使うのですか?これは主に範囲に関係しています。Pythonや他の多くの業界と同じように、私たちは範囲を始めから包含し、終わりから排他的にしたいのです。ある範囲が最後まで続いていることを示すために、どのようなインデックスを渡せばよいのでしょうか?C#では、その答えは簡単です。x..^0
からx
を最後にします。Pythonでは、明示的に与えることができるインデックスはありません。-0
と同じになるので、うまくいきません。0
というのは、最初の要素です。ですから、Pythonでは、最後まで行く範囲を表現するために、終了インデックスを完全にオフにする必要があります。x..
. もし、範囲の終端が計算されるなら、それが0
. のようにx..-y
ここでy
が計算され、次のようになった。0
. これはよくある迷惑行為であり、バグの元です。最後に、インデックスとレンジは.NET/C#のファーストクラスタイプであることに注意してください。それらの動作は、それらが適用されるもの、あるいは、インデクサで使用されることに縛られません。インデックスを受け取る独自のインデクサを定義することもできますし、別のインデクサが
Range
- で、そのようなインデクサを、例えばSpan
. しかし、例えば範囲を取るメソッドを持つこともできます。
私の答え
これは、私たちが慣れ親しんでいる古典的な構文に合わせるためだと思います。
value[^1] == value[value.Length - 1]
0を使用すると、2つの構文が並んで使用されたときに混乱します。この方法では より低い 認知的負荷
Pythonなど他の言語でも同じような規約が使われています。
関連
-
[解決済み】統合マネージドパイプラインモードで適用されないASP.NETの設定が検出された
-
[解決済み】Unity 「関連するスクリプトを読み込むことができません」「Win32Exception: システムは指定されたファイルを見つけることができません"
-
[解決済み] ...基礎となる接続は閉じられました。予期しないエラーが受信で発生しました
-
[解決済み】URLから画像をダウンロードする方法
-
[解決済み] JavaScriptで配列の先頭に新しい配列要素を追加するにはどうすればよいですか?
-
[解決済み] Bashでインデックスを指定せずに配列に新しい要素を追加する
-
[解決済み] なぜインデックス作成時にINCLUDE句を使うのか?
-
[解決済み] 条件に合致する、配列内のオブジェクトのインデックスを取得します。
-
[解決済み] 配列内の何かの最初のインデックスを返すNumPy関数はありますか?
-
[解決済み】Swiftの配列の代入が矛盾している(参照でも深層コピーでもない)理由はあるのか?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】「未割り当てのローカル変数を使用」とはどういう意味ですか?
-
[解決済み】"出力タイプがクラスライブラリのプロジェクトは直接起動できない"
-
[解決済み] メンバー '<メンバー名>' にインスタンス参照でアクセスできない
-
[解決済み】Unity3DでOnTriggerEnterが動作しない件
-
[解決済み】Socket.Selectがエラー "An operation was attempted on something that is not a socket" を返す。
-
[解決済み】ランダムなブーリアンを生成する最速の方法
-
[解決済み】aspNetCore 2.2.0 - AspNetCoreModuleV2 エラー
-
[解決済み】IntPtrとは一体何なのか?
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない
-
[解決済み】Nullableオブジェクトは値を持たなければならない?