C# Extension Methods Architecture Question

半城伤御伤魂 提交于 2019-12-23 12:29:30

问题


I recently asked this question: Compiler error referencing custom C# extension method

Marc Gravell answer was perfect and it solved my problem. But it gave me something to think about...

If and Extension method must be placed on a Static Class and the method itself must be static, why can't we create a static Extension method?

I understand that the parameter marked as "this" will be used to allow access to an instance of the object we are extending. What I do not understand is why can't a method be created to be static... it just seems to me that this is a senseless limitation...

My question is: Why can't we create an extension method that will work as a static Method?


回答1:


I expect the real answer is simply: there wasn't a good use-case. For instances, the advantage is that it enables a fluent-API over existing types (that don't themselves provide the logic) - i.e.

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

which enables LINQ:

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

With static methods, this simply isn't an issue, so there is no justification; just use the static method on the second type.

As it is, extension methods are not properly object orientated - they are a pragmatic abuse to make life easier at the expense of purity. There was no reason to dilute static methods in the same way.




回答2:


Because that feature doesn't exist in C#.

As a workaround, static methods can be implemented in another class and called through that class to provide the added functionality.

For example, XNA has a MathHelper class which ideally would have been static extensions to the Math class.

The community is asking if we think it's a good idea for C# 4.0




回答3:


My thinking would be for compatibility - if you suddenly made all static methods extension methods with the need for the this operator you could inadvertently break code which now is overriding a normal method with an extension method.

The this parameter allows control and thus doesn't break compatibility.

Just an idea though.




回答4:


First of all you would have to add yet another syntax to indicate you want to extend the static methods of the existing type. When extending syntax you really need a very good reason to do so.

Lets imagine I have a class called MyExts which allow me to add extension methods to MyClass. Why would:-

MyClass.DoSomethingExtra();

be better than

MyExts.DoSomethingExtra();

?



来源:https://stackoverflow.com/questions/638850/c-sharp-extension-methods-architecture-question

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!