2015-06-20 3 views
0

Я знаю, что на этом есть несколько сообщений, но я не нашел ответ, который я ищу, и его простой.C# - статический метод или нет, какой из них лучше?

Я знаю, что метод вызова статический или нет (инициализация (ООП)).

Пример, используя статические:

using System; 

namespace Projet_Test 
{ 
    class surfacesCalcul 
    { 
     public static int calc_air(int a, int b){ 
      int result = a * b; 

      return result; 
     } 
    } 

    /* 
    * ########################## 
    * ########################## 
    */ 

    class MainClass 
    { 
     public static void Main (string[] args) 
     { 
      Console.WriteLine(surfacesCalcul.calc_air(4,5)); 
     } 
    } 
} 

Вы называете класс (surfacesCalcul) .method, и вы можете получить доступ к Method.

-

Normal, используя ООП:

using System; 

namespace Projet_Test 
{ 
    class surfacesCalcul 
    { 
     public int calc_air(int a, int b){ 
      int result = a * b; 

      return result; 
     } 
    } 

    /* 
    * ########################## 
    * ########################## 
    */ 

    class MainClass 
    { 
     public static void Main (string[] args) 
     { 
      surfacesCalcul calculMeThis = new surfacesCalcul(); 

      Console.WriteLine(calculMeThis.calc_air(4,5)); 
     } 
    } 
} 

создании экземпляра, а затем вы можете получить доступ к методам в классе.

-

[Мой вопрос] Какой из них лучше, я просто интересно, почему с помощью статического метода более чем из экземпляра или обратного. Есть ли настоящая причина или оба хороши. Есть ли лучшее время для использования другого?

+0

Проще говоря, статические методы называются в виде имени класса 'ClassName.StaticMethod()'. вы не можете называть их из экземпляра – RadioSpace

+0

Всякий раз, когда возникает такой вопрос, моя рекомендация состоит в следующем: * рассмотреть * Инъекцию зависимостей по статическим методам. Если метод [pure] был * private *, тогда это другой вопрос. – user2864740

+0

Почему вы так уверены, что это так же просто, как «статические или нестатические»? Если бы это было так просто, наверняка вы бы нашли ответ? – BoltClock

ответ

3

Я буду спорить с обеих сторон, и вы можете выбрать.

Рассмотрим первый пример со статической функции:

namespace Projet_Test 
{ 
    class surfacesCalcul 
    { 
     public static int calc_air(int a, int b){ 
      int result = a * b; 

      return result; 
     } 
    } 

    /* 
    * ########################## 
    * ########################## 
    */ 

    class MainClass 
    { 
     public static void Main (string[] args) 
     { 
      Console.WriteLine(surfacesCalcul.calc_air(4,5)); 
     } 
    } 
} 

Это нормально, если вы никогда не заботиться о переопределении или любого вида наследования.

Теперь рассмотрим следующий пример:

class surfacesCalcul 
{ 
    public virtual int calc_air(int a, int b){ 
     int result = a * b; 

     return result; 
    } 
} 
class surfacesCalcul2 : surfacesCalcul { 
    pubic override int calc_air(int a, int b) 
    { 
     var g = base.calc_air(a, b); 
     return g*2; 

    } 
} 

/* 
* ########################## 
* ########################## 
*/ 

class MainClass 
{ 
    public static void Main (string[] args) 
    { 
     var calculMeThis = new surfacesCalcul2(); 

     Console.WriteLine(calculMeThis.calc_air(4,5)); 
    } 
} 

Вы не меняя «правильность» программы вообще просто позволяя полиморфизм делать свое дело.

В этом примере это действительно тривиально, поскольку это действительно имеет значение. Я бы предпочел маршрут с классом, поскольку статические методы не могут иметь переменные экземпляра, и вы не можете делать какой-либо инъекции зависимостей, что упрощает модульное тестирование. Реализация объекта также позволяет различным экземплярам содержать различную информацию о состоянии, в которой static не может содержать данные конкретных экземпляров.

Смежные вопросы