C# 我是否应该尽可能使我的方法保持静态?

C# 我是否应该尽可能使我的方法保持静态?,c#,parameters,methods,static,C#,Parameters,Methods,Static,我经常思考这个问题。。。这可能是一个愚蠢的问题,但问题来了 假设我有这门课: public class SomeClass { public int AProperty { get; set; } public void SomeMethod() { DoStuff(AProperty); } } 这样做有什么好处吗: public class SomeClass { public int AProperty { get; set; }

我经常思考这个问题。。。这可能是一个愚蠢的问题,但问题来了

假设我有这门课:

public class SomeClass
{
    public int AProperty { get; set; }

    public void SomeMethod()
    {
        DoStuff(AProperty);
    }
}
这样做有什么好处吗:

public class SomeClass
{
    public int AProperty { get; set; }

    public static void SomeMethod(int arg)
    {
        DoStuff(arg);
    }
}
唯一明显的优点是我现在可以直接访问
SomeMethod

因此,在允许进行少量重构的情况下,将这些方法静态化是一种好的做法,还是浪费了我的时间


编辑:我忘了提到(ShellShock的评论提醒了我),我问的原因是我使用了ReSharper,它总是建议“方法X可以变为静态”,等等……

没有。它将调用者与所使用的类紧密地结合起来。

我认为这将取决于您希望使用这些方法的方式。如果在类的几个实例上使用静态方法作为公共方法,则可以使用静态方法

举个例子,假设您有一个string类和两个string a和B。要比较a和B,可以使用a.CompareTo(B)方法或string.compare(a,B)方法


如果我错了,请纠正我。

静态方法是有意义的,前提是您能够在不创建类对象的情况下调用它们。例如,在Java中,Math类只包含静态方法,因为仅为对其他对象执行数学操作而实例化Math类没有多大意义


大多数情况下,最好避免使用静态方法。你应该熟悉面向对象编程——有很多很好的资源,解释所有的概念,比如静态方法等等。

静态
不是坏事<代码>静态与我们的编程工具包中的许多部分一样,如果使用不当,则是有害的

静态
可能非常有利。正如所指出的,
static
有可能提高速度

作为一般规则,如果方法不使用类的任何字段,那么这是评估其函数的好时机,但是最终可以调用不实例化对象的实用方法通常是有用的。例如,
DirectoryInformation
FileInformation
类包含有用的静态方法

编辑

我觉得有义务指出,这确实让嘲笑变得更加困难,但它仍然是可以测试的


这只是意味着您需要更仔细地考虑
静态方法的去向,这样您就可以随时测试它们,而无需依赖模拟/存根。(即:不要将它们放在需要持久连接到数据库的DTO上)。

我将尝试回答您提出的涉及您提供的代码示例的特定问题

如果
SomeMethod
仅在声明它的类中有用,我将避免静态转换,并将其作为实例方法

如果
SomeMethod
在其所在的类之外有用,则将其从类中排除。这可以作为某个静态实用程序类中的静态方法。要使其可测试,请确保其所有依赖项都作为参数传递给它。如果它有大量的依赖项,那么您可能希望查看设计并准确地了解它应该做什么——在传递给它的某个类中作为实例方法可能会更好

有人说静电是邪恶的。这通常是因为可变静态状态提供了陷阱,从调用静态构造函数到应用程序域的分解,变量都会挂起,在这两者之间变化。依赖于该状态的代码可能表现出不可预测的行为,测试可能变得可怕。然而,不引用可变静态的静态方法绝对没有错

对于一个(非常简单)的例子,静态是邪恶的,但可以转换为非邪恶的版本,想象一个计算某人年龄的函数:

static TimeSpan CalcAge(DateTime dob) { return DateTime.Now - dob; }
这是可测试的吗?答案是否定的。它依赖于大量不稳定的静态状态,即
DateTime.Now
。不能保证每次相同的输入都有相同的输出。要使其更易于测试,请执行以下操作:

static TimeSpan CalcAge(DateTime dob, DateTime now) { return now - dob; }

现在,函数所依赖的所有值都被传入,并且是完全可测试的。相同的输入将获得相同的输出。

如果方法不需要特定于实例的数据,则可能重复,您可以将其设置为静态。我知道halfdan,但我在问-我应该吗?这是一个有趣的问题。我不能回答,因为我没有足够的经验。然而,这里有一个有趣的链接,它争论在哪里使用或不使用“static”关键字:微软的代码分析工具总是建议,如果没有实例依赖,我应该使方法成为静态的。这是个坏建议吗?@ShellShock可能是。如果您有许多这样的方法,那么您可能违反了OOP原则。一个对象的方法应该(几乎)总是处理与该对象相关联的数据。@dark_charlie:那么你说的是,如果你可以将一个方法作为静态的,你应该重新构造,将它放在一个静态的实用程序类中?如果该方法在逻辑上与类绑定,但在技术上不使用任何成员,该怎么办?正确答案当然是“视情况而定”。存在静态方法属于类的场景。但是这些是非常罕见的,一般的规则是尽量避免使用静态方法。呃,
Math.Max
不难测试。你说如果该方法只在类中有用,那么不要将其设置为静态。使一个方法成为静态的不是也能获得性能吗?或者有一个
私有静态
方法有什么意义(这是可能的,实际上是由ReSharper建议的)?@awe-调用静态方法应该更快,这是正确的。但是,对于这个特定的示例,我认为调用
someClassInstance.SomeMethod()
SomeClass.SomeMethod(someClassInstance.apProperty)
更好。我不认为