2014-02-14 9 views
1

У меня есть набор меток (может быть от 10 до 15) в моем коде C#, все из которых являются «Статическими». Очевидно, что все они вызываются с ClassName. Все работает хорошо. Но есть ли у них какие-либо преимущества/недостатки в их использовании? или я получаю какую-либо выгоду от производительности, если я не использую «Статические» для своих методов?Когда использовать «Статические методы» в C#

+0

Этот вопрос может быть немного философским. Дело в том, что вы не можете четко ответить на этот вопрос, ничего не зная о своем программном обеспечении. – TGlatzer

+0

Вместо преимущества - недостатком является то, что это может сделать ваш код немного сложнее для модульного тестирования. Вы не можете вводить статический класс в свой код, поэтому очень сложно насмехаться. – Paddy

+0

Здесь есть несколько хороших ответов: http://programmers.stackexchange.com/questions/111938/which-is-a-better-practice-helper-methods-as-instance-or-static – Paddy

ответ

4

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

С точки зрения программирования статические методы трудно издеваться, и они вносят сильную связь с реализацией в вашем коде. Также вы теряете преимущества абстракции и полиморфизма при использовании статических методов.

Вы можете создавать статические частные методы из методов экземпляра, которые не используют данные экземпляра. Но публичные статические методы обычно вызывают проблемы с насмешкой и зависимостью, поэтому я обычно избегаю их. Одним из исключений являются фабричные методы, которые использовались для создания экземпляров класса - Loan.CreateLongTermLoan (таким образом, вы не можете иметь конструктор с пользовательским именем в C#, но вам нужно описательное имя, которое описывает детали созданного экземпляра) или Loan.Parse.

+0

Большинство моих методов взаимодействуют с База данных и передать значения обратно вызывающему абоненту. Немногие методы имеют тяжелые данные, которые передаются обратно ... Итак, будут ли они статическими делать какой-либо вред? – Abhi

+0

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

+0

Отлично. Проверка работоспособности приложения не имеет приоритета, и датапровайдер не изменится. Поэтому, я думаю, я оставлю их Static. – Abhi

2

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

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

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

FYI: На уровне IL все методы экземпляра вызываются с помощью команды CallVirt, даже если они не являются виртуальными. Это позволяет среде выполнения генерировать NullReferenceException, если вы вызываете метод по нулевой ссылке. Статический метод вызывается с помощью команды Call.

+1

+1: для четкого ответа. –

+0

Не могли бы вы объяснить это: «Если у вас есть методы, которые не работают с состоянием экземпляра, тогда они являются хорошими кандидатами на статические методы. Если у вас есть методы, которые работают с состоянием экземпляра, тогда они должны быть экземплярами (нестатическими) методами. "? – Abhi

+0

@Abhi - Я добавил дополнительную информацию к ответу – Sean

1

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

Если вам не нужен экземпляр класса в методе, он является кандидатом для маркировки как static.

1

Проблема со статическим методом приходит в тот момент, когда вам нужен подкласс.

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

1

Это концептуальный вопрос. Используется ли метод ...

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

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

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