可以是静态的C#方法应该是静态的吗?

可以是静态的C#方法应该是静态的吗?,c#,static,methods,C#,Static,Methods,可以是静态的C#方法应该是静态的吗 我们今天在讨论这个问题,我有点犹豫了。假设您有一个很长的方法,从中重构出几行。新方法可能从父方法中获取一些局部变量并返回一个值。这意味着它可能是静态的 问题是:它应该是静态的吗?它不是静态的设计或选择,只是因为它的本质不引用任何实例值。静态方法比非静态方法快,所以是的,如果可以的话,它们应该是静态的,并且没有特别的理由让它们成为非静态的我想如果你把它标记为静态的话,它会变得更可读一些…然后出现的人会知道它不引用任何实例变量而不必读取整个函数…这取决于一般来说,

可以是静态的C#方法应该是静态的吗

我们今天在讨论这个问题,我有点犹豫了。假设您有一个很长的方法,从中重构出几行。新方法可能从父方法中获取一些局部变量并返回一个值。这意味着它可能是静态的


问题是:它应该是静态的吗?它不是静态的设计或选择,只是因为它的本质不引用任何实例值。

静态方法比非静态方法快,所以是的,如果可以的话,它们应该是静态的,并且没有特别的理由让它们成为非静态的

我想如果你把它标记为静态的话,它会变得更可读一些…然后出现的人会知道它不引用任何实例变量而不必读取整个函数…

这取决于一般来说,我不会使这些方法成为静态的。代码总是在变化,也许有一天我会想把这个函数变成虚拟的,并在一个子类中重写它。或者也许有一天它需要引用实例变量。如果每个呼叫站点都必须更改,那么进行这些更改将更加困难。

不一定


将公共方法从静态移动到非静态是一个突破性的变化,需要对所有调用方或使用者进行更改。如果一个方法看起来像一个实例方法,但碰巧没有使用任何实例成员,我建议将其作为一个实例方法,作为未来的证明。

在这些情况下,我倾向于将该方法移动到一个静态或utils库中,因此我不会将“对象”的概念与“类”的概念混为一谈我不会让它成为该类的公共静态成员。原因是,将其公开为静态是在说明类的类型:不仅“此类型知道如何执行此行为”,而且“执行此行为是此类型的责任”。很可能此行为与较大的类型不再有任何实际关系

但这并不意味着我不会让它静止。问问自己:新方法在逻辑上是否属于其他地方?如果您可以回答“是”,那么您可能确实希望将其设置为静态(并将其移动)。即使那不是真的,你仍然可以使它静止。只是不要把它标记为公共的


为了方便起见,您至少可以将其标记为
internal
。这通常可以避免在无法轻松访问更合适的类型时需要移动方法,但是仍然可以在需要的地方访问它,这样它就不会显示为类用户的公共接口的一部分。

我建议最好的考虑方法是:如果需要一个类方法,需要在没有实例化该类的实例时调用它,或者维护某种全局状态,那么静态是个好主意。但总的来说,我建议您更喜欢将成员设置为非静态。

仅仅因为可以,就将某些内容设置为静态并不是一个好主意。静态方法应该是静态的,因为它们的设计是静态的,而不是偶然的

正如Michael所说,稍后更改此选项将破坏正在使用它的代码


话虽如此,听起来您是在为类创建一个私有实用程序函数,实际上,它是设计为静态的。

是的。“它可以是静态的”原因是它不会在调用它的对象的状态下运行。因此,它不是一个实例方法,而是一个类方法。如果它可以做它需要做的事情,而不需要访问实例的数据,那么它应该是静态的。

是的,它应该是静态的。有多种方法可以衡量类对其他事物的依赖程度,如其他类、方法等。将方法设置为静态是降低耦合程度的一种方法,因为您可以确保静态方法不会引用任何成员。

就我个人而言,我非常喜欢无状态。您的方法是否需要访问类的状态?如果答案是否定的(很可能是否定的,否则你不会考虑把它变成静态的方法),那么,是的,去吧。 没有进入国家就没有那么头痛了。正如隐藏其他类不需要的私有成员是一个好主意一样,向不需要它的成员隐藏状态也是一个好主意。减少访问意味着更少的bug。此外,它使线程更容易,因为它更容易保持静态成员线程安全。还有一个性能方面的考虑,因为运行时不需要将对该
的引用作为静态方法的参数传递

当然,缺点是,如果您发现以前的静态方法由于某种原因必须访问状态,那么您必须更改它。现在我了解到这可能是公共API的一个问题,所以如果这是公共类中的一个公共方法,那么也许您应该稍微考虑一下它的含义。尽管如此,在现实世界中,我从来没有遇到过这样的情况:这确实会造成问题,但也许我只是幸运而已


所以,是的,一定要这样做。

就我个人而言,我别无选择,只能让它保持静态。在这种情况下,Resharper会发出警告,我们的PM有一条规则“没有来自Resharper的警告”。

如果您能够重构出几行代码,并且生成的方法可能是静态的,这可能表明您从该方法中提取的代码行根本不属于包含类,你应该考虑把他们移到他们自己的班级。

< P>这要看情况。 实际上有两种类型的静态方法:

  • 方法是静态的,因为它们可以
  • 方法是静态的,因为它们必须
  • 在中小型代码库中,您确实可以互换地处理这两种方法

    如果您有一个属于第一类的方法(可以是静态的),那么您需要更改i
    public static void Reverse(Array array)