2008-10-14 3 views
12

Итак, я понимаю, что такое статический метод или поле, мне просто интересно, когда их использовать. То есть, при написании кода какой дизайн поддается использованию статических методов и полей.Когда мне следует писать статические методы?

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

var bmp = System.Drawing.Bitmap.LoadFromFile("Image01.jpg"); 

Что касается статических полей, то они создают наилучшие возможности для использования в таких местах?

ответ

15

Это дает лучшее представление о намерениях при использовании статической фабрики - это также позволяет вам иметь разные фабрики, которые используют одни и те же типы аргументов, но имеют другое значение. Например, представьте, если у Bitmap был LoadFromResource (строка) - было бы невозможно иметь два конструктора, которые взяли строку.

EDIT: От stevemegson в комментариях

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

+0

Статическая фабрика также может возвращать null и может с легкостью вернуть экземпляр, полученный из кеша. Многие из моих классов имеют статический FromId (int), чтобы получить экземпляр из первичного ключа, возвращая существующий кешированный экземпляр, если он у нас есть. – stevemegson

21

Статические методы, как правило, полезны для операций, которые не требуют каких-либо данных из экземпляра класса (от this) и может выполнять их целевое назначение исключительно с помощью своих аргументов.
Простым примером этого может быть метод Point::distance(Point a, Point b);, который вычисляет расстояние между двумя точками и не требует экземпляра.

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

+0

, поэтому мы должны создать нестатический метод только тогда, когда хотим получить доступ к членам данных этого «класса»? – JerryGoyal

7

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

Чем меньше нелокальное состояние зависит от метода, тем легче его понимать, поэтому static является полезным сигналом для чтения кода.

+0

Если я это правильно понимаю, вы говорите, что _alawys_ используйте статические методы, когда сможете. Но это не так. Существует множество случаев в библиотеках базового класса .NET, где методы могут быть статическими, но нет. –

+0

@ Крис, это не значит, что они сделали это правильно. – Wedge

+0

@wedge - согласился, я отлаживал некоторые из источников .NET сегодня, и это заставило меня дрожать в местах, а также стало лучше о некоторых из изворотливого кода, который я написал тоже :) – Kev

6

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

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

Другие полезные применения для статистики: Сравнить (obj a, obj b), Удалить (obj a) для объектов данных (объект не может удалить себя, поскольку его ссылка все еще существует), или статические классы для процедурного кода, которые честно нельзя смоделировать в объекте.

0

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

Итак, если вы не можете создать экземпляр, как получить доступ к методам экземпляра класса?Вызов статического метода, который возвращает экземпляр Singleton класса.

Это, конечно, только один сценарий, но есть и многие другие.

0

Вот некоторые примеры того, когда вы можете захотеть использовать статические методы:

1) Если функция не использует какие-либо переменные-члены. Вам не нужно использовать статический метод здесь, но обычно это помогает, если вы это делаете.

2) При использовании заводских методов для создания объектов. Они особенно необходимы, если вы не знаете тип, который должен быть создан заранее: например.

class AbstractClass { 
    static createObject(int i) { 
     if (i==1) { 
      return new ConcreteClass1(); 
     } else if (i==2) { 
      return new ConcreteClass2(); 
     } 
    } 
} 

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

4) При объявлении констант.

5) Операции, такие как сортировки или сравнения, которые работают с несколькими объектами класса и не привязаны к какому-либо конкретному экземпляру.

6) Когда требуется специальная обработка перед первым экземпляром объекта.

0

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

Нет вреда при добавлении статического ключевого слова: он не сломает какой-либо из кодов, ссылающихся на него. Так, например, следующий код действителен ли или нет у вас в «статический» ключевое слово:

class Foo 
{ 
    public Foo(){} 
    public static void bar(){} // valid with or without 'static' 
    public void nonStatic(){ bar(); } 
} 

... 
Foo a = new Foo(); 
a.bar(); 

Таким образом, вы должны добавить «статический» в любых методов, которые вы можете.

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