C#中的私有静态方法会伤害任何东西吗?


10

我为某个验证创建了私有验证方法,该验证方法在我的课程中多次发生(出于各种原因,我无法存储经过验证的数据)。现在,ReSharper建议将该功能设为静态。由于静态方法的已知问题,我有点不愿意这样做。这将是一个私有的静态方法。我的问题是,私有静态方法是否会引起类似公共静态方法的耦合和测试问题?这是不好的做法吗?我猜不会,但是我不确定这里是否有陷阱。


10
静态方法有哪些“已知问题”?
罗伯特·哈维,

3
@Ed:对。正确编写的静态方法无论如何都不应接触外部API或声明状态。对我而言,处理封装在类中的内部状态似乎完全可以,并且该方法不需要进行单元测试,因为单元测试可以测试类的外部行为。
罗伯特·哈维

1
静态方法易于修改全局状态,并且它们也会杀死继承(任何时候您想要扩展功能,都需要修改调用代码,因为您不能在派生类中覆盖该方法)。您与该实现紧密相关。无法模拟静态方法,这使它们很难进行单元测试。他们隐藏了依赖性。我敢肯定还有更多。我不只是盲目地避免它们,而是要求做出明智的决定。
塔玛斯·塞莱伊(TamásSzelei)2011年

2
@Tamás静态方法只有在以这种方式编写全局状态时才修改全局状态,而我从未这样做。一般来说,我只在实用工具类中使用静态方法,这些方法接受一个或多个对象并返回没有副作用的对象。这些方法都没有您描述的问题。
罗伯特·哈维

1
@TamásSzelei他们如何倾向于修改全局状态?除非将全局状态传递给参数,否则它们甚至无法找到全局状态。
CodesInChaos 2012年

Answers:


16

我会认为:“我需要测试吗?”

如果您的方法仍然是私有的,这意味着您不想对方法本身的逻辑进行单元测试,那么就可测试性和可维护性而言,您的类都是黑匣子,那么类的内部工作便是它的事。和它一个人。重构也不会受到影响,这也是要考虑的问题。

因此,我认为:不,将“私有”方法设为“私有静态”将不会产生任何长期影响。


17

从我的角度来看,私有静态方法是最简单的方法。

数据输入->方法->数据输出

不依赖于外部对象,没有副作用。您为什么认为它们不好?


谢谢。我在问题下的评论中解释了我的担忧。
陶Szelei

2
您所描述的内容仅适用于静态方法,而不依赖于静态成员变量-这可以在“好”和“坏”的静态方法之间产生区别。
布朗

2

测试类 使用公共静态方法的类可能很困难,因为(特别是)不容易对静态方法进行存根/伪造/模拟。另一方面,实例方法可以轻松模拟,特别是在它们是虚拟的或满足接口的情况下。

但是,我看不出没有使用私有静态方法的任何理由。实际上,由于不需要类的实例来占用内存,因此在性能上会有一点好处。

另一方面,任何静态的东西都有一点代码味道。这实际上是“帮手类”吗?难道该方法可以更有用地驻留在作为参数传递的类之一上吗?这些问题的答案通常是“作为静态方法很好”,但值得记住。


无论如何,包含静态方法的类已经在占用内存。您对static关键字的恐惧似乎没有根据。
罗伯特·哈维,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.