我最近问了这个问题: 引用自定义 C# 扩展方法的编译器错误
Marc Gravell 的回答很完美,它解决了我的问题。但它给了我一些思考...
如果扩展方法必须放在静态类上,并且方法本身必须是静态的,为什么我们不能创建静态扩展方法?
我知道标记为“this”的参数将用于允许访问我们正在扩展的对象的实例。我不明白的是为什么不能将方法创建为静态的……在我看来,这是一个毫无意义的限制……
我的问题是:为什么我们不能创建一个可以作为静态方法工作的扩展方法?
我最近问了这个问题: 引用自定义 C# 扩展方法的编译器错误
Marc Gravell 的回答很完美,它解决了我的问题。但它给了我一些思考...
如果扩展方法必须放在静态类上,并且方法本身必须是静态的,为什么我们不能创建静态扩展方法?
我知道标记为“this”的参数将用于允许访问我们正在扩展的对象的实例。我不明白的是为什么不能将方法创建为静态的……在我看来,这是一个毫无意义的限制……
我的问题是:为什么我们不能创建一个可以作为静态方法工作的扩展方法?
我希望真正的答案很简单:没有一个好的用例。例如,优点是它可以在现有类型(它们本身不提供逻辑)上启用 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();
使用静态方法,这根本不是问题,因此没有理由;只需在第二种类型上使用静态方法。
事实上,扩展方法不是正确面向对象的——它们是一种务实的滥用,以牺牲纯度为代价让生活更轻松。没有理由以同样的方式稀释静态方法。
因为该功能在 C# 中不存在。
作为一种解决方法,静态方法可以在另一个类中实现并通过该类调用以提供附加功能。
例如,XNA 有一个MathHelper类,理想情况下它是Math类的静态扩展。
社区正在询问我们是否认为这对 C# 4.0 来说是个好主意
我的想法是为了兼容性——如果你突然将所有静态方法扩展方法都需要 this 运算符,你可能会无意中破坏现在正在用扩展方法覆盖普通方法的代码。
this 参数允许控制,因此不会破坏兼容性。
不过只是一个想法。
首先,您必须添加另一种语法来表明您想要扩展现有类型的静态方法。在扩展语法时,您确实需要一个很好的理由来这样做。
假设我有一个名为 MyExts 的类,它允许我向 MyClass 添加扩展方法。为什么会:-
MyClass.DoSomethingExtra();
优于
MyExts.DoSomethingExtra();
?