我继承了一些常规类的代码,其中包含一些私有静态方法。代码(伪代码)看起来像这样
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成为常规实例方法相比,这样做有什么好处吗?
答案 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";}
}