9

どうしてこれなの?いくつかの拡張メソッドをロックダウンして、自分のクラスの 1 つだけで使用できるようにできると本当に便利だと思います。特定の拡張メソッドをどこでも利用できるようにしたくありません...そして、それらは通常の静的メソッドよりもはるかに見栄えがします:P


明確にするために:

これらの拡張メソッドが必要な理由は、DataGridView を持つ Form を拡張しているためです。そして、私は次のような行に非常にうんざりしています:

foreach(var row in grid.Rows.OfType<DataGridViewRow>().Where(r => (bool) r.Cells[checkBoxColumn.Index].Value))

foreach(var row in grid.SelectedRows.OfType<DataGridViewRow>().Where(r => (bool) r.Cells[checkBoxColumn.Index].Value))

私ができるように拡張メソッドが欲しい

foreach(var row in grid.Rows.CheckedRows())

foreach(var row in grid.SelectedRows.CheckedRows())

つまり、この拡張メソッドは、このクラスの外ではまったく役に立ちません。しかし、それはコードをずっときれいにします。もちろん、通常のメソッドも作成できます。これは不可能だったので、最終的にそれを行いました。

とにかく、拡張メソッドを作成して使用できる場所にこのような制限を設けることを選択した理由について、誰かが適切な議論を持っているかどうかを知りたいと思っていました. 静的クラスになければならないのは完全に理にかなっています。ネストされた静的クラスに入れることはできません...少なくとも私には...

4

3 に答える 3

4

型のソース コードを所有している場合、なぜ拡張メソッドを使用しているのですか? これらの拡張メソッドを型自体のメンバーにしないのはなぜですか?

拡張メソッドは、作成していない型を拡張するのに最適です。それらは便利なツールですが、最初の手段ではなく最後の手段とすべき間接的なレイヤーです。それらを使用して独自の型を拡張できますが、作成していない型のためにそれらの使用を予約する方が理にかなっています。

于 2009-04-21T12:51:04.083 に答える
2

タイプを拡張する場合、拡張メソッドはタイプ自体と同じようにアクセス可能である必要があります。

ベストプラクティスでは、すべての拡張メソッドを1つの場所、できれば1つの静的クラスに配置するか、単一の名前空間に含めることも提案しています。

于 2009-04-21T12:43:07.037 に答える
1

拡張メソッドを使用すると、クラスで標準のヘルパーメソッドを使用するよりも、コードが本当にクリーンになりますか?

// extension method
foreach (var row in grid.Rows.CheckedRows())
foreach (var row in grid.SelectedRows.CheckedRows())

// standard helper method
foreach (var row in CheckedRows(grid.Rows))
foreach (var row in CheckedRows(grid.SelectedRows))
于 2009-04-21T14:03:22.070 に答える