Статические методы намного быстрее и используют намного меньше памяти. Существует заблуждение, что это немного быстрее. Это немного быстрее, пока вы не положите его на петли. Кстати, некоторые циклы выглядят небольшими, но на самом деле это не так, потому что вызов метода, содержащий цикл, также является другим циклом. Вы можете заметить разницу в коде, который выполняет функции рендеринга. К сожалению, во многих случаях гораздо меньше памяти. Экземпляр позволяет легко обмениваться информацией с родственными методами. Статический метод будет запрашивать информацию, когда ему это нужно.
Но, как и при вождении автомобилей, скорость несет ответственность. Статические методы обычно имеют больше параметров, чем их экземпляр экземпляра. Поскольку экземпляр будет заботиться о кэшировании общих переменных, ваши методы экземпляра будут выглядеть красивее.
ShapeUtils.DrawCircle(stroke, pen, origin, radius);
ShapeUtils.DrawSquare(stroke, pen, x, y, width, length);
VS
ShapeUtils utils = new ShapeUtils(stroke,pen);
util.DrawCircle(origin,radius);
util.DrawSquare(x,y,width,length);
В этом случае, когда переменные экземпляра используются всеми методами большую часть времени, методы экземпляра того стоят. Экземпляры не о состоянии, речь идет об обмене, хотя ОБЩЕЕ СОСТОЯНИЕ является естественной формой обмена, они НЕ ТО ЖЕ. Общее эмпирическое правило таково: если метод тесно связан с другими методами - они так сильно любят друг друга, что при вызове одного из них нужно вызывать и другого, и они, вероятно, делят одну и ту же чашку воды - - следует сделать экземпляр. Переводить статические методы в методы экземпляров не так сложно. Вам нужно только взять общие параметры и поместить их в качестве переменных экземпляра. Обратный путь сложнее.
Или вы можете создать прокси-класс, который будет связывать статические методы. Хотя это может показаться более неэффективным в теории, практика рассказывает другую историю. Это потому, что всякий раз, когда вам нужно вызвать DrawSquare один раз (или в цикле), вы переходите прямо к статическому методу. Но всякий раз, когда вы будете использовать его снова и снова вместе с DrawCircle, вы будете использовать прокси экземпляра. Примером являются классы System.IO FileInfo (экземпляр) против File (статический).
Статические методы являются тестируемыми. На самом деле, даже более проверяемый, чем экземпляр раз. Метод GetSum (x, y) был бы очень тестируемым не только для модульного теста, но и для нагрузочного теста, интегрированного теста и теста использования. Методы экземпляра хороши для юнит-тестов, но ужасны для любых других тестов (что важнее, чем юнит-тесты, кстати), поэтому в наши дни мы получаем так много ошибок. То, что делает ВСЕ Методы непроверяемыми, это параметры, которые не имеют смысла, например (Sender s, EventArgs e) или глобальное состояние, например DateTime.Now. На самом деле статические методы настолько хороши в тестируемости, что вы видите меньше ошибок в коде C нового дистрибутива Linux, чем ваш обычный программист OO (он полон s ***, я знаю).