什么时候在实例类中使用私有静态方法是有意义的

时间:2015-10-19 12:24:13

标签: c# private static-methods

我继承了一些常规类的代码,其中包含一些私有静态方法。代码(伪代码)看起来像这样

public class Animal
{
    private string typeOfAnimal;

    public Animal(string typeOfAnimal)
    {
        this.typeOfAnimal = typeOfAnimal;
    }

    public void MakeSound()
    {
        var sound = Animal.GetSound(typeOfAnimal);

        // Make use of sound here       
    }

    private static string GetSound(string typeOfAnimal)
    {
        if(typeOfAnimal  == "dog")
            return "bark";
        else if(typeOfAnimal == "cat")
            return "mjau";
    }
}

与使GetSound成为常规实例方法相比,这样做有什么好处吗?

3 个答案:

答案 0 :(得分:5)

在静态方法中存在一些非常小的性能差异,我认为这实际上是SO人员利用的东西。此外,由于关键字的含义,使方法静态可以使您略微提高可读性。

我对此的看法通常是可读性。在这种情况下,有两个不同之处:实例与静态,公共与私有。两者本身并不比另一种更有益,其好处仅取决于预期用途。在您的情况下,它没有值是公共方法,并且不是该类型的公共API的一部分,因此您将其设置为私有,并且不希望改变实例状态,因此您将其设置为静态。

默认情况下,ReSharper会突出显示可以变为静态的方法。

答案 1 :(得分:1)

如果他们没有使用任何实例对象,那么建议将私有方法标记为静态,以获得更好的性能和可读性。

实际上,如果此类方法未标记为私有,则会显示代码分析中的以下警告。

CA1822: Mark members as static

从链接中提取 -

  

不访问实例数据或调用实例方法的成员可以   被标记为静态(在Visual Basic中共享)。标记后   方法为静态,编译器将发出非虚拟调用站点   这些成员。发送非虚拟呼叫站点将阻止检查   每次调用的运行时确保当前对象指针   是非null。这可以实现可测量的性能增益   性能敏感的代码。在某些情况下,无法访问   当前对象实例表示正确性问题。

答案 2 :(得分:0)

它看起来像一个糟糕的设计。 getSound不应该是静态的,而是在每个继承的类中实现。

当实例状态与操作本身之间没有关系时,使用静态方法。

在这种情况下,存在关系。实例状态(类型)在运行时完成

我写道:

public abstract class Animal {
    public abstract string GetSound();
}

public class Dog:Animal{
    public string GetSound(){return "bark";}
}

public class Cat:Animal{
    public string GetSound(){return "mjau";}
}