2009-04-21 112 views
9

這是爲什麼?我會發現它真的很高興能夠鎖定一些擴展方法,只能在我的一個類中使用。真的不希望有一定的可擴展方法無處不在......他們看起來比普通的靜態方法好得多:P嵌套靜態類中不允許使用擴展方法嗎?


對於澄清:

我想這些擴展方法的原因是因爲我正在擴展一個Form,其上有一個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()) 

所以,換句話說,這種擴展方法沒有用處可言這門課以外但它會使代碼更加清潔。當然也可以制定常規方法,這就是我最終做的,因爲這是不可能的。

Aaanyways,我只是想知道,如果有人有一些很好的論點,他們爲什麼選擇把這樣的限制放在可以創建擴展方法的地方。 必須處於靜態類別纔有意義。 不能在嵌套的靜態類不對我而言至少...

+0

看起來這些答案都沒有給出一個很好的技術原因,爲什麼它不能做到。 – 2012-10-22 09:08:39

+0

像你一樣,我更喜歡擴展方法的語法。 SomeThing.HasSomeCondition()優於HasSomeCondition(SomeThing)。 – Mir 2014-01-29 18:48:42

回答

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

如果你擴展一個類型,那麼擴展方法應該與類型本身相同。最佳做法還建議將所有擴展方法放在一個位置,最好放在一個靜態類中或包含在單個名稱空間中。

+5

將所有擴展方法放在一個地方與將所有實用方法放在一個地方一樣糟糕。 – 2009-09-01 18:46:18

+0

如果你正在擴展一個類型,那麼在任何階段擴展方法都不能和類型一樣可訪問? – 2012-10-22 09:09:05

4

如果您擁有該類型的源代碼,爲什麼使用擴展方法?你爲什麼不讓這些擴展方法成爲類型本身的成員?

擴展方法最適用於擴展您未創建的類型。雖然它們是有用的工具,但它們是一種間接的層,應該是最後的手段而不是第一種。雖然可以使用它們來擴展自己的類型,但更有意義的是將它們用於未創建的類型。

相關問題