Подтвердить что ты не робот

Статический или нестатический метод

Предположим, что у вас есть метод, который можно сделать статическим, внутри нестатического класса.
Например:

private double power(double a, double b)
    {
        return (Math.Pow(a, b));
    }

Вы видите какую-либо выгоду от изменения сигнатуры метода в статике? В приведенном выше примере:

private static double power(double a, double b)
    {
        return (Math.Pow(a, b));
    }

Даже если есть некоторая производительность или усиление памяти, не сделает ли компилятор его простой оптимизацией во время компиляции?


Изменить: То, что я ищу, - это преимущества, объявляющие метод как статический. я знаю, что это обычная практика. Я хотел бы понять логику этого.
И, конечно, этот метод является всего лишь примером для уточнения моих намерений.
4b9b3361

Ответ 1

Обратите внимание, что очень маловероятно, что компилятору даже разрешено сделать это изменение от вашего имени, поскольку оно изменяет подпись метода. В результате некоторые тщательно обработанные рефлексы (если вы использовали их) могли перестать работать, и компилятор действительно не может сказать, так ли это.

Ответ 2

Как определено, power является безстоящим и не имеет побочных эффектов для любого закрывающего класса, поэтому его следует объявить static.

Эта статья из MSDN переходит в некоторые отличия в производительности от нестатического и статического. Вызов примерно в четыре раза быстрее, чем создание и вызов, но это действительно имеет значение только в узком круге, который является узким местом производительности.

Ответ 3

Должно быть небольшое улучшение производительности, если вы объявите метод static, потому что компилятор выдает команду call IL вместо callvirt.

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

Ответ 4

Вы видите какую-либо выгоду от изменения сигнатуры метода в static?

Три преимущества:

  • Статические методы stateless помогают документировать и уточнять их цель. В противном случае, вы склонны волноваться, какое именно таинственное состояние зависит от метода?

  • Статический метод может быть вызван из другого статического кода, поэтому потенциально более полезно.

  • У вызовов статических методов меньше, чем у экземпляров, меньше времени на выполнение. Компилятор не может сделать это преобразование автоматически - одна из причин, почему это связано с использованием null. Вызов метода на нулевой ссылке требуется сбой с помощью исключения NullReferenceException, даже если в этом методе нет состояния экземпляра.

Ответ 5

Мне легко решить вопрос: "Должен ли я создать экземпляр этого объекта, чтобы вызвать эту функцию". В случае вашей функции я бы сказал, что ответ отрицательный, поэтому он должен быть статичным. Этот метод, похоже, снова не связан с вашим объектом, я голосую статично.

Ответ 6

Члены, которые не имеют доступа к данным экземпляра или вызовам экземпляров, могут быть помечены как статические (Shared в Visual Basic). После того, как вы помечаете методы как статические, компилятор будет выдавать неиртуальные сайты вызовов этим членам. Испускание не виртуальных сайтов вызовов предотвратит проверку во время выполнения для каждого вызова, который гарантирует, что текущий указатель объекта не равен нулю. Это может обеспечить измеримое усиление производительности для кода, чувствительного к производительности. В некоторых случаях отказ в доступе к текущему экземпляру объекта представляет собой проблему корректности.

Ответ 7

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

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


Преимущества статического метода:

Нет необходимости сначала создавать объект. Метод доступен сразу.

Это хорошо, когда у вас есть общие функции, которые не зависят от состояния конкретного объекта. Например, посмотрите класс Arrays или класс Collections из java.util.

Статические методы могут быть хорошими для заводов. Передайте свои требования в качестве параметров, верните новый объект обратно. Не конструктор в поле зрения.

Недостатки статического метода:

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

Вы можете создавать подклассы, но статический метод не может быть абстрактным, поэтому сложнее отделить реализацию от вызывающего.


(ps: я не думаю, что компилятор будет оптимизировать, если он будет статическим или нет.. но не уверен)

Ответ 8

Компилятор, скорее всего, рассмотрит вопрос об этом, когда он "JIT" кода будет настолько коротким, и если он это сделает, он, вероятно, сможет оптимизировать любую ссылку на неиспользуемый этот параметр. Но вы не можете полагаться на это.

Вам все равно придется сделать объект, чтобы вызвать его, если вы не сделаете его статичным, у которого есть намного большие накладные расходы в любом случае, если вам это не нужно по другим причинам.

Ответ 9

Я считаю, что компилятор не будет оптимизировать это в статическом методе. Существует усиление производительности, так как указатель не нужно проверять, будет ли он равен нулю во время выполнения. Для справки смотрите правило FXCop.

Ответ 10

Надеюсь, нам нужно определить разницу между статическим и нестационарным методом. Здесь я размещаю несколько простых строк кода, чтобы визуализировать концептуальную разницу.

public class StaticVsNonStatic
{
     public string NonStaticMethod() //non-static
     {

         return "I am the Non-Static Method"; 

     }

     static public string StaticMethod() //static
     {

         return "I am Static Method";
     }

 }

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

 public partial class StaticVsNonStatic_StaticVsNonWorkplace : System.Web.UI.Page
 {
     protected void Page_Load(object sender, EventArgs e)
     {

        StaticVsNonStatic objStaticVsNonStatic = new StaticVsNonStatic();
        lblDisplayNS.Text = objStaticVsNonStatic.NonStaticMethod(); //Non Static 
        lblDisplayS.Text =  StaticVsNonStatic.StaticMethod();  //Static and called without object
     }
 }

Спасибо и, пожалуйста, напишите комментарии.

С наилучшими пожеланиями, Притом Нанди [Бангладеш]