2009-04-21 18 views
9

これはなぜですか?私はそれを見つけるだろう本当にいくつかの拡張メソッドを私のクラスのうちで使用されるようにロックダウンすることができてうれしい。本当にどこでも利用できる特定の拡張メソッドを持つようにしたい...と、彼らはそう、通常の静的メソッドよりもはるかに良く見てはいけない:Pネストされた静的クラスでは拡張メソッドは使用できません。


明確にするため:

私はこれらの拡張メソッドをしたい理由があるためであります私はそれにDataGridViewを持っているフォームを拡張しています。そして、私はこれらのような行の非常に疲れています:

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()) 

そうすることができるように拡張メソッドをご希望、この拡張メソッドは全く有用ではありませんこのクラス外。しかし、それはコードをもっときれいにするでしょう。もちろん、定期的な方法を作ることもできますが、これはできませんでした。

私は、拡張メソッドを使用できる場所にこのような制限を設ける理由を知っている人がいるかどうかを知りたいと思っていました。 静的なクラスでなければならないは完全に意味があります。 ネストされた静的クラスに入れられない少なくとも...

+0

これらの回答のどれも、なぜそれができないのかという優れた技術的理由がないようです。 –

+0

あなたのように、私は拡張メソッドの構文を好む。 SomeThing.HasSomeCondition()はHasSomeCondition(SomeThing)よりも優れています。 – Mir

答えて

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)) 
+1

おそらくありません。物事が後ろ向きでないときは、私はそれがより好きです。やや。しかし、たぶん私はグリッド→ロー→チェックされたものからグリッド→ローのチェック済みのものに自分の思考を調整する必要があるかもしれませんが... ...しかし、私はこのような種類のものを主観的なもの今のもののコーディングスタイルの種類。しかし、良い点だ! =)誰かがマイクロソフトに関連した「この背後にある考え方」のものを持っていない限り、それを答えとして受け入れます。 – Svish

+2

@Svish(後で):それは主観的なものではありません。拡張されていないsystaxはそのままでは過度のネスティング(読みにくさ)を引き起こします。拡張構文はreader-tailcallsの形式です:-) –

2

タイプを拡張する場合、拡張メソッドはタイプ自体と同じようにアクセス可能でなければなりません。

ベストプラクティスでは、すべての拡張メソッドを1つの場所、好ましくは1つの静的クラスまたは1つの名前空間に含めることを推奨します。

+5

すべての拡張メソッドを1か所に配置することは、すべてのユーティリティメソッドを1つの場所に配置することと同じように悪い考えです。 –

+0

タイプを拡張している場合、どのステージでも、拡張メソッドは確実にそのタイプと同じようにアクセス可能であるべきですか? –

+3

私はOPを持っています。あなたの拡張メソッドの範囲を制限するのがいいでしょう。場合によっては、そのタイプで行う必要があるのは特定のシナリオにのみ適用されますが、引き続き拡張メソッドの構文的な砂糖を利用したいと考えています。 – xr280xr

4

タイプのソースコードを所有している場合、なぜ拡張メソッドを使用していますか?なぜ、それらの拡張メソッドを型のメンバーにするだけでいいのですか?

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

+0

ええと、彼はDataGridView ;-)を作成していないと確信しています。 –

+2

こんにちはAndrew。これについてあなたに同意することはできません。場合によっては、既存のクラスを幅広く利用できるようにすることなく、追加の機能を装飾することが理にかなっています。派生クラスを作成するか、単に拡張メソッドを使用するか、場合によっては拡張メソッドが役立ちます。ユニティ、LINQそれ自身を取って、他の人にこの動作をさせるかもしれません。 –

関連する問題