哪个更好?private static vs private

9
在这个代码示例中:
public class SuperMan {
    private static bool IsProper(decimal x) {
        return x > 31.0m && x < 45.0m;
    }

    public bool CheckStuff(string a, string b, string c) {
        // lots of code, some of which introduces a variable x
        return IsProper(x) && /* other conditions */;
    }
}

如果假设:

  1. IsProper(..) 不需要访问任何实例状态(即使在未来也是如此)。
  2. 我们不关心两个选项之间的性能差异(我们永远不应该猜测性能,而是应该进行实际测量和有需要时进行优化)。

那么 IsProper(..) 应该是 'private static' 还是 'private' 呢?


3
未来版本的 IsProper 会访问实例状态吗? - CodesInChaos
不,我会编辑问题以使其更清晰。 - kidoman
3个回答

4

这个函数可以是静态的,因为它似乎与SuperMan类及其成员没有任何关系。但你应该问问自己,这个函数是否真的属于该类。

如果你正在检查十进制数是否适合SuperMan,那么它就属于那里。但在这种情况下,我不会将其设为静态。有可能以后需要用SuperMan属性替换这些常量值。


1
这是私有的,所以只能猜测它是一个辅助函数。如果相同的代码在其他地方使用,则应该放在基类或辅助类中。 - leppie
1
Microsoft提供的代码分析工具将此标记为不良行为;如果一个方法不使用任何实例字段,则应该是静态的。我不明白你在必要时将其实例化时看到的困难在哪里(而不是过早地实例化)。 - Timwi
Microsoft提供的代码分析工具无法预知您将来对此方法所做的更改。如果该函数基本上告诉您关于实例的某些内容,即使它现在仅使用常量,也应将其实现为非静态函数。我无法确定此方法的用途,但看起来可能是这种情况。 - GolezTrol
如果我有一个'box'对象,并且我的系统中只有一种类型的盒子,我可以使其getSize方法返回该盒子的(常量)大小。尽管如此,它仍然告诉我关于该盒子实例的一些信息。当公司开始使用多种类型的盒子时,我将改变实现方式,使用实际字段,但我已经可以为那个时刻准备好我的代码,通过为盒子类提供一个非静态的getSize实例方法,并在适当的地方使用该方法。 - GolezTrol

3

将IsProper作为实例成员的原因:

  • 在继承类中需要另一种实现方式
  • 未来可能需要访问成员

将IsProper作为静态成员的原因:

  • 将其作为实例成员会有一定的性能损失
  • 如果只需创建该类的一个实例来调用IsProper,则应将其作为静态成员

0

静态方法可能会稍微快一些,但另一方面有时重构可能会更难。


怎么做?你能给我们举个例子吗? - kidoman
@KiD0M4N,Raf 是对的,静态方法更快,因为不需要创建静态内容,但是你应该在不可变对象或无状态条件下使用静态方法,以防止产生不必要的结果。 - Saeed Amiri
如果你需要创建一个对象只是为了调用方法,那么这是正确的,但如果你已经有了实例,性能差异可以忽略不计。它确实存在,但你不需要担心,除非你正在编写一些顶级的4D渲染引擎。 - GolezTrol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接