2015-10-19 3 views
2

Ive унаследовал некоторый код, который является обычным классом с некоторыми частными статическими методами в них. Код (псевдокод) выглядит следующим образомКогда имеет смысл использовать частные статические методы в классе экземпляра

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-ребята используют. Кроме того, создание метода static дает вам небольшое улучшение удобочитаемости из-за того, что подразумевает ключевое слово.

Я считаю, что это обычно читаемость. В этом случае есть два отличия: экземпляры против статического, public vs private. Ни один из них не является более выгодным, чем другой, выгоды появляются только в зависимости от предполагаемого использования. В вашем случае он не имеет значения, являющегося общедоступным методом, и не является частью общедоступного API такого типа, поэтому вы делаете его закрытым и не хотите мутировать состояние экземпляра, чтобы сделать его статическим.

По умолчанию ReSharper выделяет методы, которые могут быть сделаны статическими.

+0

Одна вещи, статические методы могут сделать что методы экземпляра не может это быть призваны поставить параметры в конструктор базового класса или пересылаются конструкторы. – Kyle

1

Желательно, чтобы ваши частные методы были статическими, если они не используют какой-либо объект-экземпляр для улучшения производительности и удобочитаемости.

Infact следующее предупреждение в анализе кода показано, если такие методы не отмечены как частные.

CA1822: Mark members as static

Выписка из ссылки -

Пользователи, которые не имеют доступа к данным экземпляра или вызова метода экземпляра могут быть помечены как статические (Shared в 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";} 
} 
Смежные вопросы