0

Almost all of the example code online for C# Excel interop has stuff like this:

monthlyChartRange = _xlSheetChart.get_Range("A3", "C4");

Yet, Resharper turns up its nose at it and demands: "Use indexed property" If you accede to its wishes (and I love R#, so I always say, "As you wish"), it changes it to:

monthlyChartRange = _xlSheetChart.Range["A3", "B4"];

Why? How is Range better than get_Range? How is the former any more indexed than the latter?

4

2 に答える 2

1

しかし、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# クラスの使用方法と同じです。

于 2015-11-21T01:06:13.913 に答える
1

Resharper は、基になる Getter の代わりにプロパティを使用するようにトレーニングされています。これは、コードが読みやすく、オブジェクト指向に似ているためです。プロパティは、裏でゲッターを呼び出すだけです。

Excel オートメーションの COM ポートは、Getter を公開しましたが、これは実際には OO のようなものではありません。

ところで、Office オートメーションの代わりにAspose Cellsを使用することをお勧めします。10兆倍の速さです。

于 2015-11-20T23:57:35.857 に答える