为什么不对所有私有方法使用静态方法?

时间:2013-05-14 13:40:20

标签: .net static

我正在尝试理解静态方法,并且我已经达成了一个令人困惑的地方。

只关注这个问题的方法,如果我创建了一个我的对象的实例(类本身不是静态的),那么我通常只能访问public,protected和/或者内部方法(取决于范围/封装) 。换句话说,我无法访问私有方法。

我已经读过,虽然最小的静态方法比非静态方法稍微有效。

因此,在创建返回类型为void的私有方法时,并在从内部创建对象引用时排除,为什么不将其设置为静态?我见过的所有代码都没有这样做,所以我只能假设我错过了这一点。

7 个答案:

答案 0 :(得分:29)

静态方法无法访问类中的非静态成员数据。

答案 1 :(得分:6)

静态方法通常应该是无状态,因此无法访问实例状态。相反,实例方法是有状态,因此可以读取和修改实例的状态。

无状态方法的典型例子是:

  • 工厂方法
  • 二元运算符
  • ...

当然,静态方法不是总是无状态,但是有静态有状态方法的样本。然后有一个的单个状态

  • 的Singleton
  • 实例池
  • ...

这些实现需要稍微小心,因为类的状态也由进程内的所有线程共享。

答案 2 :(得分:1)

  

我已经读过,虽然最小的静态方法比非静态方法稍微有效。

这不是无条件的:只有那些原本可以static但不会被遗漏static的方法会更有效率。否则,您需要手动传递对象的引用,从而提升游戏场地。此外,CLR的优化程度很高,差异很难衡量。

要回答您的问题,如果方法不通过属性或变量访问实例状态,则没有理由使方法成为非静态方法。但是,为了便于阅读,访问每个实例状态的所有方法都应该是非静态的,因为将它们设置为静态并手动传递实例无法获得性能。

为了说明这一点,你应该这样做

private void AddCount(int number) {
    current += number;
}

而不是:

// Do not do this!
private static void AddCount(MyClass obj, int number) {
    obj.current += value;
}

答案 3 :(得分:1)

如果您这样做,则无法访问班级中的非静态成员。您可以将任何实例变量作为参数传递给私有静态函数,但尤其是当函数与大量实例数据交互时,这可能会导致一些非常臃肿且难以读取的代码。如果您正在操作类的实例成员,并且这不是没有类实例的操作,则不应将其设置为静态。

作为基本的一般规则,我不会将变量或函数设置为静态,除非它对类的所有实例都很重要。当然有一些例外情况,但是如果你只是无缘无故地使所有的私有方法都是静态的,那么你可能会反对OOP范例。

答案 4 :(得分:0)

您在代码中看到的大多数方法都会以某种方式使用非静态的类变量/属性。无法从静态上下文访问这些。这意味着在静态方法中,您只能访问此类的静态成员,而不能访问特定于对象的静态成员。

答案 5 :(得分:0)

我认为至少将方法定义为静态非常有用,以明确它们不需要来自实例的数据。也就是说,我更喜欢非成员函数。查看Class design vs. IDE: Are nonmember nonfriend functions really worth it?

答案 6 :(得分:0)

有两个原因浮现在脑海中:

  1. 您无法访问班级的其他非静态成员(如上所述)
  2. 您无法覆盖子类中的静态方法
  3. IMO,静态方法应该更多地作为例外。如果您想要使用依赖注入容器“轻松访问”应用程序中的功能,您最好使用单例bean并注入它,因为如果您需要,您仍然可以选择轻松切换实现。

    .NET具有静态方法的特定用例 - 扩展方法。因此,如果您希望将您的功能作为扩展方法使用,则必须使用静态。