C# 在实例类中使用私有静态方法何时有意义

C# 在实例类中使用私有静态方法何时有意义,c#,private,static-methods,C#,Private,Static Methods,我继承了一些代码,这些代码是一个常规类,其中包含一些私有静态方法。代码(伪代码)如下所示 public class Animal { private string typeOfAnimal; public Animal(string typeOfAnimal) { this.typeOfAnimal = typeOfAnimal; } public void MakeSound() { var sound = A

我继承了一些代码,这些代码是一个常规类,其中包含一些私有静态方法。代码(伪代码)如下所示

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成为常规实例方法相比,这样做有什么好处吗?

静态方法的性能差别很小,我认为这实际上是人们所利用的。此外,由于关键字所暗示的内容,使该方法保持静态会使可读性略有提高

我对这一点的看法通常是可读性。在这种情况下,有两个区别:实例与静态、公共与私有。两者都不是天生比另一种更有益的,其益处仅取决于预期用途。在您的情况下,它作为公共方法没有任何价值,并且不是该类型的公共API的一部分,因此您将其设置为私有,并且不希望改变实例状态,从而使其成为静态的


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

建议将您的私有方法标记为静态方法,如果它们不使用任何实例对象,则可以稍微提高性能和可读性

事实上,如果这些方法未标记为私有,则代码分析中将显示以下警告

从链接中提取-

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


这看起来是个糟糕的设计。 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";}
}

静态方法可以做的一件事是调用实例方法来为基类构造函数或转发构造函数提供参数,我同意这一点。如果不打算实例化动物,则将其标记为抽象;如果有可能,则可以将方法标记为虚拟,然后在派生类中重写它们