我正在尝试理解静态方法,并且我已经达成了一个令人困惑的地方。
只关注这个问题的方法,如果我创建了一个我的对象的实例(类本身不是静态的),那么我通常只能访问public,protected和/或者内部方法(取决于范围/封装) 。换句话说,我无法访问私有方法。
我已经读过,虽然最小的静态方法比非静态方法稍微有效。
因此,在创建返回类型为void的私有方法时,并在从内部创建对象引用时排除,为什么不将其设置为静态?我见过的所有代码都没有这样做,所以我只能假设我错过了这一点。
答案 0 :(得分:29)
静态方法无法访问类中的非静态成员数据。
答案 1 :(得分:6)
静态方法通常应该是无状态,因此无法访问实例状态。相反,实例方法是有状态,因此可以读取和修改实例的状态。
无状态方法的典型例子是:
当然,静态方法不是总是无状态,但是有静态有状态方法的样本。然后有一个的单个状态:
这些实现需要稍微小心,因为类的状态也由进程内的所有线程共享。
答案 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)
有两个原因浮现在脑海中:
IMO,静态方法应该更多地作为例外。如果您想要使用依赖注入容器“轻松访问”应用程序中的功能,您最好使用单例bean并注入它,因为如果您需要,您仍然可以选择轻松切换实现。
.NET具有静态方法的特定用例 - 扩展方法。因此,如果您希望将您的功能作为扩展方法使用,则必须使用静态。