dla*_*lin 356 .net c# resharper refactoring static-methods
Resharper喜欢指出每个asp.net页面可以静态化的多个函数.如果我让它们静止,对我有帮助吗?我应该将它们设置为静态并将它们移动到实用程序类吗?
Jon*_*eet 256
在我看来,性能,命名空间污染等都是次要的.问自己什么是合乎逻辑的.该方法是在逻辑上对该类型的实例进行操作,还是与类型本身相关?如果是后者,请将其设为静态方法.如果它与不受您控制的类型相关,则仅将其移动到实用程序类中.
有时也有其逻辑上作用于一个实例,但不要发生在使用任何实例的状态的方法还没有.例如,如果你正在构建一个文件系统并且你已经获得了一个目录的概念,但是你还没有实现它,你可以编写一个返回文件系统对象类型的属性,它总是只是"file" - 但它在逻辑上与实例相关,因此应该是一个实例方法.如果要将方法设置为虚拟,这也很重要 - 您的特定实现可能不需要状态,但派生类可能不需要.(例如,询问集合是否为只读集合 - 您可能尚未实现该集合的只读形式,但它显然是集合本身的属性,而不是类型.)
Jef*_*tes 237
静态方法与实例方法
10.2.5 C#语言规范的静态和实例成员解释了差异.通常,静态方法可以提供比实例方法更小的性能增强,但仅限于极端情况下(有关更多详细信息,请参阅此答案).
FxCop或代码分析中的规则CA1822规定:
"在[将成员标记为静态]之后,编译器将向这些成员发出非虚拟调用站点,这将阻止在运行时检查每个调用以确保当前对象指针为非null.这可以导致可测量的性能增益对于性能敏感的代码.在某些情况下,访问当前对象实例的失败代表了正确性问题."
实用
工具类除非在设计中有意义,否则不应将它们移动到实用工具类.如果静态方法涉及特定类型,就像ToRadians(double degrees)
方法涉及表示角度的类一样,那么该方法作为该类型的静态成员存在是有意义的(注意,这是用于演示目的的复杂示例).
Jas*_*rue 22
我确信这不会发生在你的情况下,但是我在一些代码中看到的一个"难闻的气味"我不得不通过维护使用大量静态方法而受到影响.
不幸的是,它们是假定特定应用程序状态的静态方法.(为什么我们每个应用程序只有一个用户!为什么不让User类在静态变量中跟踪它?)它们是访问全局变量的美化方式.他们也有静态构造函数(!),这几乎总是一个坏主意.(我知道有几个合理的例外).
但是,静态方法在分解出实际上并不依赖于对象实例状态的域逻辑时非常有用.它们可以使您的代码更具可读性.
确保你把它们放在正确的位置.静态方法是否会侵入性地操纵其他对象的内部状态?可以说一个好的案例,他们的行为属于这些类之一吗?如果你没有正确地分离问题,你可能会在以后遇到麻烦.
这很有趣:
http://thecuttingledge.com/?p=57
ReSharper实际上并不建议你让你的方法保持静态.你应该问问自己为什么那个方法在那个类中,而不是比如在其签名中出现的一个类...
但是这里是resharper documentaion所说的:http: //confluence.jetbrains.net/display/ReSharper/Member+can+be+made+static
对于类中的复杂逻辑,我发现私有静态方法在创建隔离逻辑时非常有用,其中实例输入在方法签名中明确定义,并且不会发生实例副作用.所有输出必须通过返回值或out/ref参数.将复杂的逻辑分解为无副作用的代码块可以提高代码的可读性和开发团队对它的信心.
另一方面,它可能导致被实用方法的扩散污染的类.像往常一样,团队编码约定的逻辑命名,文档和一致应用可以缓解这种情况.
我希望您已经了解静态方法和实例方法之间的区别。另外,答案可以有长有短。其他人已经提供了长答案。
我的简短回答:是的,您可以按照 ReSharper 的建议将它们转换为静态方法。这样做并没有什么坏处。相反,通过将方法设为静态,您实际上是在保护该方法,这样就不会不必要地将任何实例成员放入该方法中。这样,您就可以实现 OOP 原则“最小化类和成员的可访问性”。
当 ReSharper 建议可以将实例方法转换为静态方法时,它实际上是在告诉您,“为什么 .. 这个方法位于此类中,但实际上并未使用其任何状态?” 所以,它给了你深思熟虑的空间。然后,您可以意识到是否需要将该方法移至静态实用程序类。根据 SOLID 原则,一个类应该只有一个核心职责。因此,您可以通过这种方式更好地清理您的类。有时,即使在实例类中,您也确实需要一些辅助方法。如果是这种情况,您可以将它们保留在 #region 帮助程序中。
归档时间: |
|
查看次数: |
60497 次 |
最近记录: |