Когда мне следует писать статические методы?
Итак, я понимаю, что такое статический метод 9X_c# или поле, мне просто интересно, когда их 9X_c#.net использовать. То есть при написании кода 9X_oop какой дизайн позволяет использовать статические 9X_oo методы и поля.
Один из распространенных способов 9X_ood - использовать статические методы в качестве 9X_.cs-file статической фабрики, но это также легко 9X_object-oriented-modeling можно сделать, перегрузив конструктор. Верный? Например:
var bmp = System.Drawing.Bitmap.LoadFromFile("Image01.jpg");
Что 9X_.cs-file касается статических полей, лучше ли использовать 9X_.cs-file создание одиночных объектов?
Ответ #1
Ответ на вопрос: Когда мне следует писать статические методы?
Статические методы обычно полезны для операций, которым 9X_object-oriented не требуются какие-либо данные от экземпляра 9X_c-sharp класса (из this
), и которые могут выполнять 9X_oo-design свое прямое назначение, используя только 9X_oops свои аргументы.
Простым примером этого 9X_ood может быть метод Point::distance(Point a, Point b);
, который вычисляет расстояние 9X_object-oriented-modeling между двумя точками и не требует экземпляра.
Статические 9X_ood поля полезны, среди прочего, для констант, которые 9X_oo не так часто меняются и используются всеми 9X_oops экземплярами класса.
- поэтому мы должны создавать нестатический метод ...
Ответ #2
Ответ на вопрос: Когда мне следует писать статические методы?
Это дает лучшее представление о намерениях, когда 9X_visual-c# вы используете статическую фабрику - это 9X_oops также позволяет вам иметь разные фабрики, которые 9X_object-oriented-design принимают одни и те же типы аргументов, но 9X_object-oriented-design имеют разное значение. Например, представьте, что 9X_object-oriented-design если бы Bitmap имел LoadFromResource (string), было 9X_object-oriented бы невозможно иметь два конструктора, которые 9X_oop оба принимали бы строку.
РЕДАКТИРОВАТЬ: от Стивемегсона 9X_object-oriented-modeling в комментариях
Статическая фабрика также 9X_c#.net может возвращать значение null, и ей легче 9X_c-sharp возвращать экземпляр, полученный из кеша. Многие 9X_visual-c# из моих классов имеют статический FromId 9X_object-oriented-modeling (int) для получения экземпляра из первичного 9X_oops ключа, возвращая существующий кэшированный 9X_object-oriented-design экземпляр, если он у нас есть.
Ответ #3
Ответ на вопрос: Когда мне следует писать статические методы?
Я бы сказал, что используйте статические 9X_c# методы всякий раз, когда у вас есть функции, не 9X_c#.net зависящие от состояния экземпляра, т.е. не 9X_.cs-file зависит от каких-либо полей экземпляра.
Чем 9X_csharp меньше нелокальное состояние, от которого 9X_csharp зависит метод, тем легче его понять, поэтому 9X_csharp static
является полезным сигналом для читателя 9X_object-oriented кода.
- Если я правильно понимаю, вы говорите, что _alawys_ использует статические методы, когда это возможно. Но это неправильно. В библиотеках базовых классов .NET есть ...
Ответ #4
Ответ на вопрос: Когда мне следует писать статические методы?
Я четко помню, что методы экземпляра работают 9X_object-oriented с / внутри отдельных объектов, в то время 9X_.cs-file как статические методы что-то делают для 9X_oops класса.
В случае LoadFromFile() вам нужен 9X_c#.net статический метод, потому что вам нужна 9X_object-oriented-design пустая ссылка, если загрузка не удалась 9X_c# - экземпляр еще не существует. Если вы реализовали 9X_object-oriented-design его как конструктор, вам пришлось бы генерировать 9X_visual-c# исключение при ошибке.
Другие полезные применения 9X_c# статики: сравнение (obj a, obj b), удаление 9X_ood (obj a) для объектов данных (объект не может 9X_oo-design удалить себя, поскольку его ссылка все еще 9X_oop существует) или статические классы для процедурного 9X_visual-c# кода, который честно не может быть смоделирован 9X_c-sharp в объекте.
Ответ #5
Ответ на вопрос: Когда мне следует писать статические методы?
Используйте статический метод, если метод 9X_ood не принадлежит определенному объекту.
Например, если 9X_oops вы посмотрите на класс Math в .NET framework, вы 9X_object-oriented увидите что все методы статичны. Почему? Потому 9X_object-oriented-design что нет причин создавать объект для использования 9X_c# методов. Зачем вам создавать объект Math
класс, когда 9X_c#.net все, что вам нужно, - это абсолютное значение 9X_oo-design чего-либо? Не здесь нет причин для этого, поэтому 9X_oo метод статичен.
Итак, когда вы создаете класс, спросите 9X_csharp себя:
Принадлежит ли этот метод объекту или 9X_c#.net самому классу?
Метод принадлежит объекту, если 9X_object-oriented-design он изменяет состояние объекта. Если метод 9X_csharp не изменяет конкретный объект, скорее всего, он 9X_.cs-file может быть статическим.
Другой пример. Предположим, вы 9X_c#-language хотите узнать, сколько объектов класса это 9X_c#-language создано (не спрашивайте меня, почему ...). Для 9X_.cs-file этой задачи вы можете создать статический 9X_object-oriented метод GetNumberOfObjects()
(и вам, очевидно, нужно статическое 9X_c# поле, и код в конструкторе тоже). Зачем 9X_oo-design мне статичность, вы могли бы просить. Что 9X_csharp ж, ответьте на поставленный выше вопрос, и 9X_c#-language вы увидите. Метод не принадлежат какому-либо 9X_csharp конкретному объекту. Кроме того, он не изменяет 9X_visual-c# никаких объектов.
Надеюсь, в этом есть смысл.
Ответ #6
Ответ на вопрос: Когда мне следует писать статические методы?
Вы должны использовать статические методы 9X_object-oriented-design всякий раз, когда у вас есть функция, не 9X_.cs-file зависящая от конкретного объекта этого класса.
Нет 9X_oops ничего плохого в добавлении ключевого слова 9X_object-oriented-design static: оно не нарушит код, который на него 9X_.cs-file ссылается. Так, например, следующий код 9X_oo-design действителен независимо от того, есть ли 9X_oo у вас ключевое слово static:
class Foo { public Foo(){} public static void bar(){} // valid with or without 'static' public void nonStatic(){ bar(); } } ... Foo a = new Foo(); a.bar();
Таким образом, вы 9X_object-oriented-design должны добавить «статику» к любым методам, которые 9X_oo вы можете.
Ответ #7
Ответ на вопрос: Когда мне следует писать статические методы?
Вот несколько примеров, когда вы можете 9X_csharp использовать статические методы:
1) Когда 9X_c-sharp функция не использует никаких переменных-членов. Здесь 9X_oo не обязательно использовать статический 9X_csharp метод, но обычно он помогает.
2) При использовании 9X_visual-c# фабричных методов для создания объектов. Они 9X_oops особенно необходимы, если вы не знаете заранее 9X_object-oriented-design создаваемый тип: например,
class AbstractClass { static createObject(int i) { if (i==1) { return new ConcreteClass1(); } else if (i==2) { return new ConcreteClass2(); } } }
3) Когда вы контролируете 9X_object-oriented или иным образом отслеживаете количество 9X_csharp экземпляров класса. Синглтон является наиболее 9X_c#-language часто используемым примером этого.
4) При 9X_oops объявлении констант.
5) Такие операции, как 9X_object-oriented-modeling сортировка или сравнение, которые работают 9X_csharp с несколькими объектами класса и не привязаны 9X_csharp к какому-либо конкретному экземпляру.
6) Когда 9X_ood перед первым созданием объекта должна быть 9X_oop выполнена специальная обработка.
-
11
-
7
-
5
-
19
-
11
-
13
-
22
-
32
-
3
-
6
-
8
-
6
-
14
-
4
-
7
-
2
-
4
-
5
-
3
-
5
-
6
-
2
-
5
-
10
-
5
-
6
-
4
-
7
-
10
-
7
-
5
-
6
-
4
-
4
-
4
-
8
-
7
-
9
-
3
-
5
-
9
-
4
-
4
-
5
-
2
-
9
-
9
-
4
-
5
-
4