Когда мне следует писать статические методы?

Итак, я понимаю, что такое статический метод 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 создание одиночных объектов?

21
0
7
Общее количество ответов: 7

Ответ #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 экземплярами класса.

31
1

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

Ответ #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 экземпляр, если он у нас есть.

16
0

Ответ #3

Ответ на вопрос: Когда мне следует писать статические методы?

Я бы сказал, что используйте статические 9X_c# методы всякий раз, когда у вас есть функции, не 9X_c#.net зависящие от состояния экземпляра, т.е. не 9X_.cs-file зависит от каких-либо полей экземпляра.

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

9
1

  • Если я правильно понимаю, вы говорите, что _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 в объекте.

8
0

Ответ #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
0

Ответ #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 вы можете.

2
0

Ответ #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 выполнена специальная обработка.

1
0