如果所有静态方法都是扩展方法默认会发生什么?

时间:2010-09-01 00:12:15

标签: c# .net extension-methods

静态方法总是应该用括号来封装参数。因此在键入时使用扩展方法要容易得多。这就是我喜欢扩展方法的原因之一。

我不确定何时使用扩展或静态方法更好。我想如果所有静态方法都是默认扩展方法会发生什么。对于扩展方法来说很容易输入,但这个想法的其他优点或缺点是什么?

修改

在我意识到将扩展方法的所有静态方法都做好之后并不是一个好主意。 例如:不接受参数或接受不同类型参数的方法。我们也可以改变这个问题。如果静态方法可以使用静态方法,那么静态方法可以使用默认的静态方法,它接受自己类型的参数。

4 个答案:

答案 0 :(得分:3)

虽然许多静态方法(特别是对于值类型和字符串)对它们自身的实例进行操作,但是有一些静态方法,扩展语法对它们没有意义,因为它们不依赖于它们自己的类型。例如,ConfigurationManager是一个没有实例组件的“纯静态”;尝试将任何此类调用构造为扩展方法是没有意义的。

我还遇到了在具有相似签名的不同实用程序库中引用重复扩展方法的情况;引用包含该方法的静态类是在没有大型重构的情况下解决这种歧义的唯一方法。

最后,扩展方法很适合。但是,我目前的项目可能有点太“流利”了;我们有大多数String静态的扩展方法包装器,如IsNullOrEmpty()和Format(),以及解析每个值类型的扩展方法(int.Parse,byte.Parse,DateTime.Parse等的包装器)和变体(例如TryParses,IsNullOrBlank,IsNotNullOrEmpty等)。你可以对字符串实例做很多事情,在我们的项目中,大多数都可以添加到该实例的末尾(甚至是文字)。当你达到那个时期时,这会大大降低VS的速度,并增加其内存占用量(以及提供IntelliSense扩展和使用/参考建议的ReSharper)。

答案 1 :(得分:2)

扩展方法适用于对象的实例,而静态方法适用于类型本身。静态方法提供工厂或实用程序功能,而扩展方法则为特定对象添加语义值。

例如,取Process.Start(ProcessStartInfo):它是在Process类型上调用的静态方法。它是一个扩展方法会很奇怪,因为你必须在实际调用它之前创建一个Process实例(注意:是的,有一个Process.Start方法可以对实例进行操作,但它假设Process对象已经填充了其起始信息。

如果要扩展类型实例的功能而无法更改原始源,则扩展方法是有意义的。如果您想拥有与您的类型密切相关的静态实用程序函数,静态方法是有意义的。它们各有用途。

答案 2 :(得分:0)

所有扩展方法都是静态方法。不同之处在于,在扩展方法中,方法签名中的第一个参数必须包含this关键字,以指示该方法的扩展名为...从某种意义上讲,该方法对于它所定义的类型是静态的,但是,(正如Chris在他的回答中提到的),它们是非静态的(实例)到第一个参数中定义的类型......

如果默认情况下所有静态方法都是扩展名,那么对于没有thgis keywpord的旧代码,你会怎么做?以及编译器如何知道将扩展方法“附加”到什么类型?

答案 3 :(得分:0)

首先,当涉及到int.Parse(string),double.Parse(string)等时,所有想要成为字符串的扩展方法的人都会有很大的歧义。关于该方法是否应该在逻辑上扩展操作类型的功能,而不是在逻辑上与定义静态方法的类型相关联,这是一个重要的设计决策。

相关问题