可否将能够被定义为静态方法的C#方法设置为静态?
我们今天讨论了这个问题,我对此有些犹豫。假设您有一个长方法,并从中重构出几行代码。新方法可能会从父方法中获取一些本地变量并返回一个值。这意味着该方法可以被定义为静态方法。
问题是:它应该被定义为静态方法吗?它不是由设计或选择而静态化,只是因为其本质上没有引用任何实例值。
可否将能够被定义为静态方法的C#方法设置为静态?
我们今天讨论了这个问题,我对此有些犹豫。假设您有一个长方法,并从中重构出几行代码。新方法可能会从父方法中获取一些本地变量并返回一个值。这意味着该方法可以被定义为静态方法。
问题是:它应该被定义为静态方法吗?它不是由设计或选择而静态化,只是因为其本质上没有引用任何实例值。
我不会将其设为公共的静态成员变量。原因是将其设为公共静态的同时也在表达该类类型的某种含义:不仅是“这个类型知道如何执行这个行为”,还有“执行该行为是该类型的职责”。而大多数情况下,该行为与整个类型已经没有任何实质上的关联了。
当然,这并不意味着我不会将其设为静态的。你可以自问一下:新方法是否逻辑上应该属于其他类?如果你的答案是“是”,那么你可能希望将其设为静态(并移动它)。即使答案是否定的,它仍然可以被设为静态。只是不要标记为 public
。
出于方便起见,您至少可以将其标记为 internal
。这通常避免了需要移动该方法的情况,如果您没有容易访问到更合适的类型,但仍然以一种方式使其可访问,在需要的地方使用,而不会成为该类用户公共接口的一部分。
不一定。
将公共方法从静态变为非静态是一种破坏性的更改,需要对所有调用者或消费者进行更改。如果一个方法看起来像是实例方法,但恰好没有使用任何实例成员,我建议将其作为一种未来保护的措施,更改为实例方法。
是的。 "它可以是静态的"的原因是它不操作调用它的对象的状态。 因此,它不是实例方法,而是类方法。 如果它可以在不访问实例数据的情况下完成它需要做的事情,那么它应该是静态的。
是的,应该这样做。有各种耦合度度量指标来衡量你的类对其他内容的依赖程度,例如其他类、方法等。将方法改为静态方法可以降低耦合度,因为你可以确定静态方法不会引用任何成员变量。
我认为如果您将其标记为静态,那么它会更易读……这样,来看的人就会知道它没有引用任何实例变量,而不必阅读整个函数……
静态方法比非静态方法更快,所以如果可以的话,它们应该是静态的,并且没有特殊的原因让它们保持非静态。
个人而言,我非常喜欢无状态。您的方法需要访问类的状态吗?如果答案是否定的(很可能是否,否则您不会考虑将其作为静态方法),那么可以采用。
没有访问状态会减少麻烦。就像隐藏其他类不需要的私有成员一样,隐藏不需要状态的成员也是一个好主意。减少访问可以意味着减少错误。此外,它使线程更容易,因为保持静态成员的线程安全性要容易得多。还有一个性能考虑,因为运行时不需要传递对this的引用作为静态方法的参数。
当然,缺点是如果您发现以前的静态方法出于某种原因必须访问状态,那么您必须更改它。现在我明白了,这可能是公共API的问题,因此,如果这是公共类中的公共方法,则可能应该考虑一下其影响。尽管如此,在现实世界中,我从未遇到过这种情况真正造成问题,但也许我只是幸运。
所以,尽管放心使用吧。
仅仅因为你可以将某个东西变成静态的并不是一个好主意。静态方法应该是由设计而非偶然性而成为静态的。
就像Michael所说的那样,稍后更改会破坏使用它的代码。
话虽如此,听起来你正在为类创建一个私有实用函数,这个函数根据设计实际上是静态的。