答案 0 :(得分:1)
什么是扩展方法?
请参阅此问题 - What are Extension Methods?
为什么我们需要使用它?
Somehow, I don't agree to the idea of using extension methods to extend an existing type since practically this is impossible.
您想要使用扩展方法的唯一原因是为任何类型提供fluency and readabilty
。
检查此代码..
string str = "Hello world";
string result = Helper.Method2(Helper.Method1(str));
此扩展方法的代码可以写成如下。
string str = "Hello world";
string result = str.Method1().Method2();
//compiler ultimately compiles this code as Helper.Method2(Helper.Method1(str));
哪一个更流畅可读?具有扩展方法的那个。
答案 1 :(得分:0)
如果您需要向第三方.dll或某些您无法直接访问源代码的组件添加功能,则扩展方法非常有用。
因此,例如,您没有直接访问权限来修改String类,但使用扩展方法可以向其添加方法。 (或给该类用户留下这种印象)
答案 2 :(得分:0)
扩展方法允许您向现有类型添加方法,而无需创建派生类。当您无法访问框架等代码时,它也很有用。更多信息here
答案 3 :(得分:0)
扩展方法只是增加了一点“语法糖”,使编写代码变得更容易。
例如,IEnumerable<T>
接口上有很多扩展方法。其中一些是在名为EnumerableExtensions
的静态类中定义的,可能是这样的:
public static class EnumerableExtensions
{
public static IEnumerable<T> Where<T>(this IEnumerable<T> items, Expression<Func<T, bool>> predicate)
{
// Filter based on the predicate and return the matching elements
}
}
请注意,类和方法都标记为static
,并且第一个参数前面有this
个关键字。 this
将此方法标记为扩展方法。
现在,要在IEnumerable<T>
的实例上使用此方法,比如说myTees
,只需输入
var filtered = myTees.Where(t => t.IsCool);
但这不是实际编译成.dll的代码。编译器将此调用替换为扩展方法,并调用
var filtered = EnumerableExtensions.Where(myTees, t => t.IsCool);
正如您所见,它只是另一个类上的常规静态方法。
因此,扩展方法的一个主要方面是使静态方法的使用更加顺畅,从而产生更易读的代码。
当然,这也会产生这样的效果:您可以在.NET框架中扩展任何类型 - 甚至(尤其是)您自己没有创建的类型!它就像编写一个常规的静态方法一样简单,该方法将您想要扩展的类型作为第一个参数,在其前面添加this
并标记包含的类static
。供应苹果派! =)
答案 4 :(得分:0)
它们允许您使用新方法扩展所有已有的类。不改变他们的代码,或者Dll。
好处是,它们是有意使用的。例如:假设您经常需要在项目中剪切字符串,直到找到特定的字符串。
通常你会写这样的代码:
input.Substring(0,input.LastIndexOf(tofind))
这有问题,如果找不到字符串,则会出现异常。和开发人员都很懒。因此,如果他们认为,这不会发生,他们只是不抓住它或重构所有的遮挡物。所以,你可以在某个地方制作一个方法。
public static class StringExtensions
{
public static string SubstringTill(string input, string till, StringComparison comparisonType = StringComparison.CurrentCulture)
{
int occourance = input.LastIndexOf(till, comparisonType);
if (occourance < 0)
return input;
return input.Substring(0, occourance);
}
}
和...然后是困难的部分。向所有开发人员发送电子邮件,现在已经存在,并且他们将来应该使用它。并将其放入新开发人员的文档中......或者:
只需在
方法中添加“this”即可public static string SubstringTill(this string input, string till, StringComparison comparisonType = StringComparison.CurrentCulture)
你得到一个扩展方法。当任何人编写代码并且需要这样的代码时,他会看到呃,已经有人做了这样做的方法。所以可重用性和DRY更容易实现。如果它正确记录了它的作用,以及可能出现的例外情况。