22

可能重复:
扩展方法与静态实用程序类

我正在构建一个通用函数的 API,它基于 .NET 中的对象执行操作。例如; 我创建了一个检查字符串以查看它是否是电子邮件地址的函数。

我可以有:

static bool IsEmailAddress(string text)
{
    return IsMail(text);
}

或者我可以创建一个可以像这样使用的扩展方法:

string text = "HelloWorld@Email.com";
if (text.IsEmailAddress())
{
}

哪个更合适,或者您认为因为这是一个通用库,我可以在技术上以两种方式实现它并允许开发人员决定哪个最适合他们?

4

5 回答 5

17

创建扩展方法意味着当用户使用该类型时,它将在智能感知期间自动显示。您必须小心,不要在开发人员浏览的方法列表中添加很多噪音(尤其是在创建可重用框架时)。例如,当这些方法仅在特定上下文中可用时,您可能最好使用“普通”静态方法。尤其是在实现通用类型的扩展方法时,例如string.

ToXml(this string)以扩展方法或扩展方法为例ToInt(this string)。尽管拥有这些扩展方法看起来很方便,但将文本转换为 XML 并不是您在整个应用程序中都会做的事情,而且很容易做到XmlHelper.ToXml(someString)

只有一件事更糟糕,那就是在object.

如果你正在编写一个可重用的框架,那么 Krzysztof Cwalina 的书 Framework-Design-Guidelines绝对是必读的。

于 2012-07-04T13:57:07.303 回答
2

我更喜欢扩展方法,因为你的代码很优雅,你可以在框架的密封类上定义扩展方法。

于 2012-07-04T13:49:30.997 回答
2

问题是您将针对哪个 .NET Framework?如果 < 3.5 则扩展方法不可用。否则,你为什么要创建一个新班级?

于 2012-07-04T13:59:16.613 回答
1

扩展方法自动成为静态类的一部分。这意味着消费者可以使用扩展方法,也可以根据需要从类中调用静态方法。我尽可能多地使用扩展方法,如果将它们放在正确的命名空间中,它们更容易发现。

于 2012-07-04T13:52:14.100 回答
1

扩展方法允许开发人员不知道助手类被调用的确切位置以及它的位置,更不用说它存在的事实了。请注意,您仍然需要将它们的命名空间放在using子句中——也许将它们放置在您的应用程序的一些通用的顶级命名空间中。

于 2012-07-04T13:52:52.307 回答