9

このメソッドは、リスト全体で最初に出現したアイテムのゼロベースのインデックスをList<T>.IndexOf()返します(見つかった場合)。それ以外の場合、–1

それと、 Code Completeで読んだばかりのこととの間に類似点が見られます。これは、「隠された意味を持つ変数を避ける」ように指示しています。

次に例を示します。変数pageCountの値は、-1に等しくない限り、印刷されたページ数を表す場合があります。-1に等しい場合は、エラーが発生したことを示します。

まあ、それが十分に明確に文書化されているので、意味が「隠されている」かどうかはわかりませんが、nullは-1よりも良い意味を私に伝えているようです。.HasValueは>-1よりもはるかに良いチェックのように読めます。私の知る限り、List型とnull許容型はどちらもC#2.0で導入されたため、再調整する理由はint下位互換性とは関係がないと思います。それで、理由があったのか、それとも誰かが実装するのを忘れただけなのか、そして私たちは今、その間違いに永遠に耐えなければならないのかどうか知っていますか?

4

6 に答える 6

10

Listは、null許容Tと同様に、2.0バージョンのランタイムでリリースされました。しかし、Listは、1.0バージョンのランタイムに存在するIListを実装しており、null許容がないだけでなく、ジェネリックをサポートしていませんでした。IListインターフェイスのコントラクトを満たすには、実装者はindexoffailureで-1を返す必要があります。コードコンプリートは、同意するコントラクトを満たさなければならないことも維持しているため、List.Indexofは-1を返す必要があります。


コメントへの回答:

ジェネリックを使用した2.0ランタイムまでに、非ジェネリックバージョンに対して作成されたアプリケーションはすでに数千ありました。そのコードは、非ジェネリックインターフェイスの拡張としてジェネリックインターフェイスをサポートすることにより、最も効果的に機能するように移行できます。また、画像は同じ名前で90%同じ使用法でクラス化する必要がありますが、いくつかのメソッドの場合はまったく異なるセマンティクスです。

于 2012-06-02T18:49:17.793 に答える
6

System.Collections.Generic.Listnull許容型とともに.NET2.0で導入された可能性がありますが、-1の使用はかなり前からあります。 ArrayList.IndexOf()リストボックスのArray.IndexOf()、、、など。したがってString.IndexOf()、既存のライブラリとの一貫性を保つために、おそらく同じことを行いました。(実際、従来のVBでさえこの意味を持っているため、.NET 1.0よりも前のものです)SelectedIndexList<T>

@rerun指摘しているように、これは単なるスタイルの一貫性ではなく、実際にはインターフェイスコントラクトの一部です。だから彼に+1。

List<T>の足跡をたどる必要ArrayListはなく、実装する必要もありませんでしたが、IListそうすることで、すでにそれらに精通しているプログラマーにとってはるかに便利になりました。

于 2012-06-02T18:47:33.550 に答える
2

推測ですが、歴史的な理由と読みやすさに関係していると思います。-1 は「特別な値」ですが、それ以外の場合は決して返されません。私の意見で引用したルールは、主に、複数の意味を持つ可能性のある値を返さないようにすることです。-1 は C++ および同様の言語の標準であるため、言語間でややイディオムになっています。また、hasvalue の方が読みやすいかもしれませんが、フレームワーク全体で一貫して同じスタイルにするのが最善だと思います。これには、ゼロから始める必要があります。最後に、私の限られた経験では、null 許容型を他の場所で使用するにはボックス化を解除する必要があるため、価値があるよりも問題が発生する可能性がありますが、それは私だけです。

于 2012-06-02T19:12:39.840 に答える
1

フレームワーク1.1にはnull可能なものがなく、APIは当時作成されていたため、下位互換性のためだと思います。

于 2012-06-02T18:46:22.703 に答える
1

その理由は、Nullable<T>( を記述するときに使用される実際の型T?) には、インデックス検索のような単純なものに望ましくない複雑さが伴うという単純な事実にある可能性があります。T? x実行することx == nullは、実際には構文糖衣に過ぎず、そうではx.HasValueないことが判明した場合nullでも、 を介して実際の値にアクセスする必要がありますx.Value

有効なインデックスではない負の値を返すだけと比較して、実際には何も得られません。実際、あなたは物事をより複雑にしています。

于 2012-06-02T18:56:59.337 に答える
0

これは、.NET ライブラリだけでなく、String.IndexOf他の多くの実装やメソッドのバリエーションと同じパターンに従います。IndexOf

戻り値として -1 を使用することはマジック ナンバーであり、通常は避けるべきです。ただし、このパターンはよく知られており、ライブラリ メソッドを実装する場合に明らかに有利です。

于 2012-06-02T18:50:47.870 に答える