我正在构建一个通用函数的API,它根据.NET中的对象执行操作。例如;我创建了一个检查字符串以查看它是否是电子邮件地址的函数。
我可以:
static bool IsEmailAddress(string text)
{
return IsMail(text);
}
或者我可以创建一个像这样使用的扩展方法:
string text = "HelloWorld@Email.com";
if (text.IsEmailAddress())
{
}
哪个更合适,或者你认为既然这是一个通用的库,我可以在技术上实现它两种方式,并允许开发人员决定哪种方法最适合他们?
答案 0 :(得分:14)
创建扩展方法意味着当用户使用该类型时,它将在intellisense期间自动显示。您必须小心不要在开发人员浏览的方法列表中添加大量噪声(特别是在创建可重用框架时)。例如,当这些方法仅在某个上下文中可用时,您可能更适合使用“常规”静态方法。特别是在实现常规类型的扩展方法时,例如string
。
以ToXml(this string)
扩展方法或ToInt(this string)
扩展方法为例。虽然使用这些扩展方法似乎很方便,但是在整个应用程序中你不会将文本转换为XML,而且XmlHelper.ToXml(someString)
也很容易。
只有一件事情更糟,那就是在object
上添加一个扩展方法。
如果您正在编写可重用的框架,the book Framework-Design-Guidelines by Krzysztof Cwalina绝对必须阅读。
答案 1 :(得分:2)
我更喜欢扩展方法,因为你的代码很优雅,你可以在框架的密封类上定义扩展方法。
答案 2 :(得分:2)
问题是您将针对哪个.NET Framework?如果< 3.5然后扩展方法不可用。否则,你为什么要创建一个新类?
答案 3 :(得分:0)
扩展方法自动成为静态类的一部分。这意味着消费者可以使用扩展方法,也可以根据需要从类中调用静态方法。我尽可能多地使用扩展方法,如果将它们放在适当的命名空间中,它们就更容易被发现。
答案 4 :(得分:0)
扩展方法允许开发人员不确切地知道调用帮助器类的位置以及它所在的位置,更不用说它存在的事实。请注意,您仍然需要将其命名空间放在using
子句中 - 也许将它们放在应用程序的一些常见的顶级命名空间中。