しかし、Resharper はそれに対して鼻を鳴らし、「インデックス付きプロパティを使用する」ことを要求します。
ちょっとした紹介 - COM はずっと前にさかのぼります。COM はバイナリ プロトコルであり、一部の COM 対応言語にはプロパティの概念がないことに注意してください。
COM インデックス付きプロパティは、一般に次のように定義されます。
[propget, id(DISPID_VALUE), helpstring("blah")]
HRESULT Item([in] long Index, [out, retval] BSTR* Item);
ディスパッチ ID は、これがインデックス付きプロパティに通常使用されるデフォルト プロパティDISPID_VALUE
であることをクライアントに通知するものです。プロパティ getとしてどのように定義されているかに注意してください。引数を取るプロパティ ゲッターの概念は、後で説明するように、一部のプログラミング言語を混乱させる可能性があります。index
完全な COM 準拠のクライアント言語
COM 対応の優れたクライアント言語 (VB6、VBA、.NET など) を使用すると、次のようにオブジェクトを操作できます。
string thing = myObject.Item[2];
これらの言語は、この特定のプロパティがパラメーターpropget
であると見なしin
ます。としてマークされているという事実は、DISPID_VALUE
それが既定のプロパティであることを COM クライアントに伝えるため、かなり魅力的です。2 つと 2 つを組み合わせると、クライアントは、洗練された角かっこを使用できるように、それがおしゃれなインデックス付きプロパティでなければならないことに気付くでしょう。
これは単なる砂糖の構文であることを認識することが重要です。これは、デフォルトのインデックス付きプロパティを呼び出すためのより便利な方法です。舞台裏では、以下に示すように、非準拠の言語ごとに同じ COM プロパティ ゲッター メソッドを呼び出します。
COM にあまり準拠していないクライアント言語
一部のプログラミング言語 (Visual Objects 2.6 など) は、パラメーターを受け取る COM プロパティが表示されるとびっくりします (VO を使用するとまたびっくりします)。インデックス パラメータを取り、文字列を返すメソッド呼び出し:
string thing = myObject.get_Item(2) // Boo!
これらのクライアントは、プロパティが としてマークされているという重要な事実も見逃している可能性がありますDISPID_VALUE
。
C# では、メソッド スタイルの操作を自由に使用してプロパティをクエリしたり、COM が設計されているようにインデックス プロパティ表記を使用したりできます。
結局のところ、c# は OO です。プロパティを理解します。インデクサーを理解しているのに、なぜそれらを使用しないのですか?
したがって、Resharper が COM 優先のインデックス付きスタイルを使用するように求めているのはなぜですか。通常の C# クラスの使用方法と同じです。