扩展方法是一项非常有用的功能,您可以在任何类中添加许多所需的函数。但我想知道它是否存在可能会给我带来麻烦的缺点。有什么评论或建议吗?
扩展方法是一项非常有用的功能,您可以在任何类中添加许多所需的函数。但我想知道它是否存在可能会给我带来麻烦的缺点。有什么评论或建议吗?
注意两点:
使用静态方法进行空值检查是不同的。并非一定更好或更差 - 而是不同的,开发人员需要理解这一点。在空值上调用方法可能会出乎意料,并且(有时)非常有用。
没有多态性(尽管支持重载)
如果两个扩展方法对源类型产生冲突(而且都不符合“更好”的条件),则可能会导致歧义混乱。编译器将拒绝使用任何一个...这意味着在程序集A中添加扩展方法可能会破坏*程序集B中的不相关代码。我见过这种情况几次...
您无法在C# 2.0中使用“in”,因此,如果您正在为C# 2.0编写库,则无法使用它
它需要[ExtensionAttribute] - 因此,如果您正在为.NET 2.0编写库,则会遇到麻烦:如果声明自己的[ExtensionAttribute],则可能会与.NET 3.5调用方发生冲突
但请不要误解 - 我是一个大粉丝!
您可能已经猜到,我目前正在编写一个需要为C# 2.0和.NET 2.0调用者工作的库 - 并且(令人恼火的是)扩展方法将非常有用!
*=仅针对编译器;已经编译的代码将没有问题
SafeEquals<T,U>(this T it, U other)
扩展方法,该方法将调用存储在 SafeComparer<T,U>.CheckEquality(it, other)
中的 Func<T,U,bool>
[默认委托将检查 T
和 U
并确定如何执行比较]。 - supercat扩展方法有两种不同的应用场景:
然而,在你自己的程序集中,为特定的类、结构或接口提供扩展方法是一个非常主观的设计问题。如果你想对使用你的程序集的人很慷慨,你可以创建非常小的接口,理想情况下只有几个属性,然后将整个批量的扩展方法附加到它们上面。以下是一个例子:
public interface IPointF{
float X { get; }
float Y { get; }
}
public struct PointF: IPointF{
public PointF(float x, float y){
X=x;Y=y;
}
public float X { get; private set; }
public float Y { get; private set; }
}
public static class PointHelper{
public static PointF ADD(this IPointF p, float val){
return new PointF(p.x+val, p.y+val);
}
}
因此,任何未来的用户都可以通过继承IPoint来节省大量编码时间。
}`,我这样调用 `AD.ToDTO()` - 当单个用户使用时它可以正常工作,但是当多个用户调用时,应用程序会卡在这个方法上,并在一段时间后抛出超时异常,这是扩展方法的一种缺点吗?因为我们在这里有一个静态类。
- Gaurav AroraMyNamespace.ExtMethod(myObject, params)
这样做放弃了漂亮的语法,但它只是一个函数。(实际上,导入整个命名空间的烦恼可能对命名空间中的任何实体都是一个问题,因此这并不是扩展方法所特有的。在某些情况下,使用#include别名可以减轻痛苦。) - C Perkins