1

インデクサーは常に個別のシーケンスを参照する必要がありますか? いいえと思いたいところですが、他の方の意見をお聞きしたいです。

質問は、多項式クラスで「ショートカット」が作成された後に始まりました。

Polynomial p = new Polynomial(coefficients);

y = p(5.2) を計算する通常の方法は、次のメソッド呼び出しを使用することでした。

double y = p.Evaluate(5.2);

(double 型のインデクサーを使用して) 作成されたショートカットは次のとおりです。

double y = p[5.2];

多項式 (連続関数) は、意味があれば、一種のアナログ配列または連続配列と見なされているという考えだったと思います。ただし、Evaluate 関数はインターフェイス IMathFunction から取得されます。このインターフェイスは、補間クラスでも使用されます。

CubicSplineInterpolator f = new CubicSplineInterpolator(arrayOfPoints)

補間クラスには、補間に使用されるポイントの配列にアクセスするための int 型のパブリック インデクサーが既にあるため、ここで問題が発生します。インターポレーターは (制限内で) 連続関数のように機能しますが、ショートカットがすべての IMathFunction クラスに展開されると、f[5.0] と f[5] は異なるオブジェクトを返し、コードを読むときに混乱する可能性があります。

double y;
Point<double> p;

// ... some other code

CubicSplineInterpolator f = new CubicSplineInterpolator(arrayOfPoints)
y = f[5.0];
p = f[5];

double 型のインデクサーのこの使用について心配する必要がありますか、それともこれを使用する必要がありますか?

4

2 に答える 2

3

Microsoft のインデックス付きプロパティの設計ガイドラインによると、「インデックス付きプロパティは、項目のグループへの配列のようなアクセスを可能にします。」したがって、その意図は明らかに、個別のセットからインデクサーを取得することです。さらに:

System.Int32、System.Int64、System.String、System.Object、列挙型、またはジェネリック型パラメーター以外のパラメーター型を持つインデクサーは避けてください。

設計に他のタイプのパラメーターが必要な場合は、メンバーが論理コレクションへのアクセスを本当に表しているかどうかを強く再評価する必要があります。そうでない場合は、代わりにメソッドを使用し、Get または Set で始まるメソッド名を選択することを検討してください。

純粋に数学的な用語では、関数はマッピングとして定義されます。おそらく実数のような無限のセットに対して、.NET 言語はメソッドを使用してそのようなマッピングを表します。それが従うべきパターンです。

Invokeデリゲートは、メソッドが既定のメソッドとして扱われる特殊なケースであることに注意してください。myDelegate(arg1)これにより、の代わりに書くことができますmyDelegate.Invoke(arg1)。ただし、これは特殊なケースです。デフォルトのメソッドは、C# または VB では使用できません。

インデクサーは添え字と考えたほうがよいかもしれません。結局のところ、数学では、ベクトルやシーケンスなどのコレクションの要素は、通常、添字付きのコレクションの名前で表されます。f xが値 x における関数 f の値を表すことはほとんどありません。

于 2011-11-11T02:20:57.913 に答える
2

インデクサーで行っていることは通常、メソッドで行われます...インデクサーをメソッドのように使用できますが、意図したセマンティクスではないため、コードを読むほとんどの人を混乱させる可能性があります。コレクション内の特定のアイテムに直接アクセスするため、または同様の目的の操作のために、インデクサーを予約することをお勧めします。

于 2011-11-11T01:21:04.637 に答える