嵌套静态类中不允许使用扩展方法?

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

换句话说,这个扩展方法在类外完全没有用处。但是它可以让代码更加简洁。当然也可以创建常规方法,因为这是不可能的。
无论如何,我只是好奇是否有人有一些好的理由来解释为什么要对扩展方法的创建和使用限制。必须在静态类中创建是完全有道理的。但是不能在嵌套的静态类中创建,至少对我来说并不合理。

似乎这些答案都没有给出一个好的技术原因,说明为什么它不能被完成。 - Ray Booysen
和你一样,我更喜欢扩展方法语法。SomeThing.HasSomeCondition() 比 HasSomeCondition(SomeThing) 更优秀。 - Mir
3个回答

4
如果您拥有类型的源代码,为什么要使用扩展方法?为什么不将这些扩展方法作为类型本身的成员?
扩展方法最好用于扩展您没有创建的类型。虽然它们是有用的工具,但它们是一种间接层,应该是最后的选择而不是首选。虽然您可以使用它们来扩展自己的类型,但更明智的做法是将它们保留给您没有创建的类型。

嗯,我很确定他没有创建DataGridView;-) - Tim Jarvis
2
嗨,安德鲁。我不能同意你的看法。在某些情况下,为现有类添加额外功能而不使其广泛可用是有意义的。我们可以派生,也许创建一个装饰器类或者简单地使用扩展方法,在某些情况下,扩展方法会有所帮助。以Unity、LINQ本身和其他一些行为为例。 - Ray Booysen

2
如果您正在扩展一个类型,那么扩展方法应该与类型本身一样易于访问。
最佳实践还建议将所有扩展方法放在同一个地方,最好是一个静态类中或包含在单个命名空间中。

6
把所有扩展方法都放在同一个地方和把所有实用方法都放在同一个地方一样,都是一个坏主意。 - Bruno Martinez
如果您正在扩展一种类型,那么在任何阶段,扩展方法都不应该像类型本身那样容易访问,对吧? - Ray Booysen
3
我同意原作者的观点。限制扩展方法的适用范围会更好,因为有时候你只需要在特定的情况下使用类型,但仍希望利用扩展方法提供的语法糖。 - xr280xr
像@Eamon所说,扩展提供了一种通过“扩展”某个目标类型的功能来组合调用的好方法。如果该特性强制您在更广泛的范围内进行这些扩展,则无法使用扩展(以及它们所做的所有好事)来扩展具有私有功能的目标。您的选择是使功能比当前设计更少私有,或者不使用扩展功能。如果该特性提供了一个有用的语法,则不合逻辑的是它只在您使用非私有功能扩展目标类型时才有用。 - Mike
顺便说一句,我给你点赞,因为我相信从语言设计师的角度来看,你的答案是正确的。 - Mike

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(远晚):这不是(纯粹)主观的:非扩展语法组合不良,因为它会导致过多的嵌套(即可读性差)。如果您愿意,扩展语法是一种读者尾调用的形式 :-) - Eamon Nerbonne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接