ReSharper喜欢在每个ASP中指出多个函数。NET页面,可以设置为静态。如果我把它们变成静态的,对我有帮助吗?我是否应该将它们设置为静态并将它们移动到实用程序类中?


当前回答

对于类中的复杂逻辑,我发现私有静态方法在创建隔离逻辑时很有用,其中实例输入在方法签名中明确定义,并且不会发生实例副作用。所有输出必须通过返回值或out/ref参数。将复杂的逻辑分解成无副作用的代码块可以提高代码的可读性和开发团队对它的信心。

另一方面,它可能导致类被大量实用方法所污染。通常,逻辑命名、文档和团队编码约定的一致应用程序可以缓解这种情况。

其他回答

静态方法与实例方法 c#语言规范的静态成员和实例成员解释了这种差异。一般来说,静态方法可以提供比实例方法非常小的性能增强,但仅在某些极端情况下(有关详细信息,请参阅此回答)。

FxCop或代码分析中的CA1822规则规定:

在[将成员标记为静态]之后,编译器将向这些成员发出非虚拟调用站点,这将防止在 运行时,确保当前对象指针为 非空。这可以导致可测量的性能增益 性能敏感的代码。在某些情况下,访问失败 当前对象实例表示正确性问题。”

实用程序类 除非在设计中有意义,否则不应该将它们移到实用程序类中。如果静态方法与特定类型有关,就像ToRadians(双度)方法与表示角度的类有关一样,那么该方法作为该类型的静态成员存在是有意义的(注意,为了演示,这是一个复杂的示例)。

读起来很有趣: http://thecuttingledge.com/?p=57

ReSharper实际上并不是建议您将方法设置为静态的。 你应该问问自己,为什么这个方法在那个类中,而不是在它的签名中出现的类之一…

但ReSharper documentaion是这么说的: http://confluence.jetbrains.net/display/ReSharper/Member+can+be+made+static

我希望您已经理解了静态方法和实例方法之间的区别。而且,答案可以有长有短。其他人已经给出了很长的答案。

我的简短回答是:是的,你可以像ReSharper建议的那样将它们转换为静态方法。这样做没有坏处。相反,通过将方法设置为静态,实际上是在保护该方法,这样就不会不必要地将任何实例成员插入该方法。通过这种方式,您可以实现OOP原则“最小化类和成员的可访问性”。

When ReSharper is suggesting that an instance method can be converted to a static one, it is actually telling you, "Why the .. this method is sitting in this class but it is not actually using any of its states?" So, it gives you food for thought. Then, it is you who can realize the need for moving that method to a static utility class or not. According to the SOLID principles, a class should have only one core responsibility. So, you can do a better cleanup of your classes in that way. Sometimes, you do need some helper methods even in your instance class. If that is the case, you may keep them within a #region helper.

ReSharper不检查逻辑。它只检查方法是否使用实例成员。 如果方法是私有的,并且只被(可能只有一个)实例方法调用,这是一个让它成为实例方法的标志。

只是我的一点钱:将所有共享的静态方法添加到实用程序类中,您就可以添加

using static className; 

到您的using语句,这使得代码更快地输入和更容易阅读。例如,我在继承的一些代码中有大量所谓的“全局变量”。我没有在一个属于实例类的类中创建全局变量,而是将它们全部设置为全局类的静态属性。它完成了这项工作,虽然有些混乱,但我可以按名称引用属性,因为我已经引用了静态名称空间。

我不知道这是不是一个好的练习。关于c# 4/5,我有很多东西要学,还有很多遗留代码要重构,所以我只是想让Roselyn的技巧来指导我。

Joey