2015-10-19 90 views
2

我继承了一些代码,它们是一些常规类,其中包含一些私有静态方法。代码(伪代码)看起来像这样什么时候在实例类中使用私有静态方法是有意义的

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

回答

4

静态方法的性能差别很小,我认为这实际上是SO们利用的东西。此外,由于关键字暗示的内容,使得该方法处于静态状态可以使您的可读性略有提高。

我认为这通常是可读性。在这种情况下,有两个区别:实例vs静态,公共与私有。它们本身并不比其他方式更有益,其好处仅仅取决于预期的用途。在你的情况下,它没有任何价值是公共方法,并且不属于该类型的公共API,所以你把它变成私有的,并且不想改变实例状态,所以你把它变成静态的。

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

+0

一件事静态方法可以做到这一点的实例方法不能就是被称为供应参数传递给基类构造函数或转发构造函数。 – Kyle

1

如果您的私有方法没有使用任何实例对象来提高性能和可读性,建议您将私有方法标记为静态方法。

Infact如果这些方法未标记为私有,则会显示代码分析中的以下警告。从链接

CA1822: Mark members as static

提取物 - 不访问实例数据或调用实例方法

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

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";} 
} 
相关问题