我应该尽可能地让我的方法保持静态吗?

时间:2010-09-13 10:39:44

标签: 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 static void SomeMethod(int arg)
    {
        DoStuff(arg);
    }
}

显而易见的唯一优势是我现在可以直接访问SomeMethod

在一些重构允许的情况下,或者浪费我的时间,将这些方法保持静态是一种好习惯吗?

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

5 个答案:

答案 0 :(得分:15)

Static不是邪恶的。如果使用不正确,Static是邪恶的,就像编程工具包的许多部分一样。

Static可能非常有利。正如the accepted answer here指出的那样,static可以提高潜在的速度。

作为一般规则,如果该方法不使用该类的任何字段,那么它是评估其功能的好时机,但是最终可以在不实例化对象的情况下调用的实用方法通常是有用的。例如,DirectoryInformationFileInformation类包含有用的静态方法。

修改

我觉得有必要指出它确实让嘲讽变得更加困难,但它仍然是可以测试的。

这只是意味着您需要更加思考 static方法的位置,以便您可以随时测试它们而无需依赖模拟/存根。 (即:不要将它们放在需要与数据库持久连接的DTO上)。

答案 1 :(得分:2)

没有。 Static is evil。它将调用者与使用的类makes it hard to test紧密耦合。

答案 2 :(得分:2)

静态方法是有意义的,如果你应该能够在不创建类的对象之前调用它们。例如,在Java中,Math-Class只包含静态方法,因为仅仅为了对其他对象进行数学运算来实例化Math-Class没有多大意义。

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

答案 3 :(得分:2)

我将尝试回答您涉及您提供的代码示例的具体问题。

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

如果SomeMethod在它所在的类之外有用,那么将它从类中排除。这可能是某个静态实用程序类中的静态方法。要使其可测试,请确保将其所有依赖项作为参数传递给它。如果它有大量的依赖关系,你可能想要查看设计并确切地弄清楚它应该做什么 - 它可能更好地作为你传递给它的一个类中的实例方法。

有些人说静电是邪恶的。这通常是因为可变静态提供的陷阱,其中变量从一个静态构造函数被调用到应用程序域的拆除,在两者之间发生变化。依赖于该状态的代码可能会出现不可预测的行为,并且测试可能会变得非常可怕。但是,静态方法绝对没有错误,它不引用可变静态。

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

static TimeSpan CalcAge(DateTime dob) { return DateTime.Now - dob; }

可测试吗?答案是不。它依赖于DateTime.Now的大规模易失性静态。每次都不能保证相同输入的输出相同。为了使它更适合测试:

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

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

答案 4 :(得分:1)

我认为这取决于你想要使用这些方法的方式。如果将静态方法用作类的几个实例的常用方法,则可以使用静态方法。

为了举例,假设您有一个字符串类和两个字符串A和B.要比较A和B,您可以使用A.CompareTo(B)方法或String.Compare(A,B)方法

如果我错了,请纠正我。