4

我最近问了这个问题: 引用自定义 C# 扩展方法的编译器错误

Marc Gravell 的回答很完美,它解决了我的问题。但它给了我一些思考...

如果扩展方法必须放在静态类上,并且方法本身必须是静态的,为什么我们不能创建静态扩展方法?

我知道标记为“this”的参数将用于允许访问我们正在扩展的对象的实例。我不明白的是为什么不能将方法创建为静态的……在我看来,这是一个毫无意义的限制……

我的问题是:为什么我们不能创建一个可以作为静态方法工作的扩展方法?

4

4 回答 4

7

我希望真正的答案很简单:没有一个好的用例。例如,优点是它可以在现有类型(它们本身不提供逻辑)上启用 fluent-API - 即

var foo = data.Where(x=>x.IsActive).OrderBy(x=>x.Price).First();

启用 LINQ:

var foo = (from x in data
           where x.IsActive
           order by x.Price
           select x).First();

使用静态方法,这根本不是问题,因此没有理由;只需在第二种类型上使用静态方法。

事实上,扩展方法不是正确面向对象的——它们是一种务实的滥用,以牺牲纯度为代价让生活更轻松。没有理由以同样的方式稀释静态方法。

于 2009-03-12T14:33:13.723 回答
3

因为该功能在 C# 中不存在。

作为一种解决方法,静态方法可以在另一个类中实现并通过该类调用以提供附加功能。

例如,XNA 有一个MathHelper类,理想情况下它是Math类的静态扩展。

社区正在询问我们是否认为这对 C# 4.0 来说是个好主意

于 2009-03-12T14:32:55.937 回答
1

我的想法是为了兼容性——如果你突然将所有静态方法扩展方法都需要 this 运算符,你可能会无意中破坏现在正在用扩展方法覆盖普通方法的代码。

this 参数允许控制,因此不会破坏兼容性。

不过只是一个想法。

于 2009-03-12T14:45:12.790 回答
0

首先,您必须添加另一种语法来表明您想要扩展现有类型的静态方法。在扩展语法时,您确实需要一个很好的理由来这样做。

假设我有一个名为 MyExts 的类,它允许我向 MyClass 添加扩展方法。为什么会:-

MyClass.DoSomethingExtra();

优于

MyExts.DoSomethingExtra();

?

于 2009-03-12T14:34:52.813 回答