C#扩展方法架构问题

时间:2009-03-12 14:27:25

标签: c# extension-methods

我最近问了这个问题: Compiler error referencing custom C# extension method

Marc Gravell的回答很完美,它解决了我的问题。但它让我有所思考......

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

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

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

4 个答案:

答案 0 :(得分:7)

我希望真正的答案很简单:没有一个好的用例。例如,优点是它能够在现有类型(本身不提供逻辑)的基础上实现流畅的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();

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

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

答案 1 :(得分:3)

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

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

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

如果我们认为C#4.0是个好主意,那么社区是asking

答案 2 :(得分:1)

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

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

只是一个想法。

答案 3 :(得分:0)

首先,您必须添加另一种语法,以指示您要扩展现有类型的静态方法。在扩展语法时,你真的需要这么做的理由。

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

MyClass.DoSomethingExtra();

优于

MyExts.DoSomethingExtra();