何时在实例类中使用私有静态方法是有意义的?

5

我接手了一些有关IT技术的代码,其中包括一些常规类以及一些私有静态方法。这段(伪代码)看起来像这样:

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个回答

7

静态方法在性能方面有微小的差异,我认为这实际上是SO网站利用的一些东西。另外,将方法设置为静态会使代码更易读,因为关键字的含义。

我的看法通常是可读性。在这种情况下,存在两个不同之处:实例与静态、公共与私有。没有哪个比另一个本质上更有益,只有在使用意图上才会出现优点。在您的情况下,它不是公共方法,并且不是类型的公共API的一部分,所以将其设置为private,也不想改变实例状态,所以将其设置为static。

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


静态方法可以做的一件事情是,被调用以提供参数给基类构造函数或转发构造函数,而实例方法则不能。 - Kyle

1
如果您的私有方法没有使用任何实例对象,建议将其标记为静态,以获得略微更好的性能和可读性。事实上,如果这些方法没有标记为私有,则代码分析中会显示以下警告。从链接中提取如下内容:不访问实例数据或调用实例方法的成员可以标记为静态(在 Visual Basic 中为共享)。在将这些方法标记为静态后,编译器将发出对这些成员的非虚拟调用站点。发出非虚拟调用站点将防止每次调用时运行时检查,以确保当前对象指针为非空。这可以为性能敏感的代码实现可衡量的性能增益。在某些情况下,无法访问当前对象实例表示正确性问题。警告链接:CA1822: 将成员标记为静态

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";}
}

我同意这个观点。如果Animal不会被实例化,那么将其标记为抽象类;如果有可能被实例化,则可以将方法标记为虚拟的,然后在派生类中重写它们。 - MattE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接