Когда я должен использовать статические методы в классе и каковы преимущества?

У меня есть понятие статических переменных, но что является преимуществами статических методов в классе. Я работал над некоторыми проектами, но я не сделал метод статичным. Каждый раз, когда я должен назвать метод класса, я создаю объект того класса и называю требуемый метод.

Q: Статическая переменная в методе содержит, это - значение, даже когда метод выполняется, но доступен только в его содержании метода, но каково лучшее определение статического метода?

Q: Действительно ли вызов является статическим методом, не создавая объект того класса, единственное преимущество статического метода?

Q: Каков доступный диапазон для статического метода?

Спасибо

62
задан Naveed 20 September 2010 в 05:47
поделиться

8 ответов

Ваше описание статической переменной более соответствует тому, что встречается в C. Понятие статической переменной в терминах Object Oriented (Объектно-ориентированная) концептуально отличается. Я черчу здесь из опыта работы на Java. Статические методы и поля полезны, когда они концептуально не принадлежат к какому-то экземпляру.

Рассмотрим математический класс, который содержит некоторые общие значения, такие как Pi или e, и некоторые полезные функции, такие как грех и кос. На самом деле нет смысла создавать отдельные экземпляры для использования такого рода функциональности, поэтому они лучше как статика:

// This makes little sense
Math m = new Math();
float answer = m.sin(45);

// This would make more sense
float answer = Math.sin(45);

В OO-языках (опять же, с точки зрения Java) функции, или более известные как методы, не могут иметь статических локальных переменных. Только классы могут иметь статические члены, которые, как я уже говорил, мало похожи на статические в C.

.
62
ответ дан 24 November 2019 в 16:46
поделиться

Статические методы не передают «этот» указатель на объект, поэтому они не могут ссылаться на нестатические переменные или методы, но, следовательно, могут быть более эффективными во время выполнения (меньше параметров и Нет накладных расходов, чтобы создать и уничтожить объект).

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

15
ответ дан 24 November 2019 в 16:46
поделиться

Единственный раз, когда вы хотите использовать статический метод в классе, это когда данный метод не требует создания экземпляра класса. Это может быть при попытке вернуть общий источник данных (например, Singleton) или при выполнении операции, которая не изменяет внутреннее состояние объекта (например, String.format).

Эта запись википедии довольно хорошо объясняет статические методы: http://en.wikipedia.org/wiki/Method_ (computer_science) # Static_methods

6
ответ дан 24 November 2019 в 16:46
поделиться

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

Статические методы не должны содержать "состояние". Все, что связано с состоянием, должно быть привязано к инстанцированному объекту, а не к классу.

4
ответ дан 24 November 2019 в 16:46
поделиться

Нет, вы не можете сделать это таким образом. Но вы можете, если вы загрузите его через XMLHTTTREQUEST (AJAX). Таким образом, вы можете прервать связь, если это займет слишком долго.
Например, вы можете использовать Опция Timeout Если вы используете jQuery:

$.ajax({ url: "a.js", dataType: "script", timeout: 1000});

таким образом, если скрипт не загружается в течение 1 секунды (1000 мс), запрос будет прерван. Также вы можете использовать {async: false} для предотвращения выполнения кода во время загрузки скрипта (если вам нужно).

Проверьте http://api.jquery.com/jquery.ajax/ для получения дополнительных вариантов.

-121--3186075-

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

-121--3320758-

Синтаксис (PHP) для статических методов:

<?php
class Number {
    public static function multiply($a, $b) {
        return $a * $b;
    }
}
?>

Клиентский код:

echo Number::multiply(1, 2);

, который имеет больше смысла, чем:

$number = new Number();
echo $number->multiply(1, 2);

в качестве метода [) . Используйте любые переменные классов и как таковые не требуют экземпляра номера .

12
ответ дан 24 November 2019 в 16:46
поделиться

По сути, статические методы позволяют писать процедурный код на объектно-ориентированном языке. Это позволяет вызывать методы без необходимости сначала создавать объект.

8
ответ дан 24 November 2019 в 16:46
поделиться

Статические методы в PHP:

Можно вызывать без создания объекта класса.

Может вызываться только статические методы и функции.

2
ответ дан 24 November 2019 в 16:46
поделиться

Мне бы пришлось немного вспомнить код UserControlDesigner...

Новелла: Я не думаю, что это возможно.

И вот длинная история:

Из того, что я помню, элементы управления пользователя, расположенные в ASCX-файлах, никогда не запускаются в дизайнере. То есть код в файле ASCX или ASCX.CS никогда не компилируется и не выполняется в Visual Studio. Это необходимо для предотвращения утечек памяти, вызванных тем, что в CLR нельзя выгрузить загруженные сборки. Для запуска кода в пользовательском элементе управления Visual Studio необходимо скомпилировать ASCX в DLL, затем загрузить его, а затем запустить код. При каждом изменении ASCX необходимо будет выполнять эту операцию повторно. Каждый раз, когда эта операция происходит больше памяти будет поглощаться дополнительно загруженной DLL, созданной из вашего ASCX.

Из-за этого ограничения в CLR дизайнер управления пользователями фактически не компилирует и не запускает файл ASCX. Вместо этого он анализирует ASCX-файл и ищет элементы управления внутри него, а затем загружает эти элементы управления. Для каждого элемента управления, найденного в файле ASCX, будет создан связанный дизайнер элементов управления и отображен HTML времени разработки этого элемента управления.

Существует несколько способов обойти это:

  1. Вместо использования пользовательского элемента управления ASCX можно написать обычный пользовательский элемент управления, который берется из Control и код записывается в файл CS или VB.
  2. Скомпилировать ASCX в DLL. Дэвид Эббо написал запись в блоге о том, как это сделать.

Причина, по которой эти два решения должны работать, заключается в том, что они оба предполагают компиляцию кода в DLL. Идея в том, что DLL не меняется очень часто, так что это безопасно для Visual Studio, чтобы загрузить DLL без риска, чтобы перезагрузить его для каждого раза DLL изменений (и утечки памяти).

-121--4904232-

Есть хитрость, которую я однажды узнал из списка вопросов для интервью Скотта Хансельмана . Все программы, работающие под управлением .NET, можно легко вывести в командной строке с помощью:

tasklist/m «mscor *»

В нем перечислены все процессы с mscor * среди загруженных модулей.

Можно применить тот же метод в коде:

public static bool IsDotNetProcess(this Process process)
{
  var modules = process.Modules.Cast<ProcessModule>().Where(
      m => m.ModuleName.StartsWith("mscor", StringComparison.InvariantCultureIgnoreCase));

  return modules.Any();
}
-121--1856404-

Один из распространенных методов статических методов используется в именованной идиоме конструктора. См. раздел http://www.parashift.com/c++-faq-lite/ctors.html # faq-10.8 .

2
ответ дан 24 November 2019 в 16:46
поделиться