У меня есть набор меток (может быть от 10 до 15) в моем коде C#, все из которых являются «Статическими». Очевидно, что все они вызываются с ClassName. Все работает хорошо. Но есть ли у них какие-либо преимущества/недостатки в их использовании? или я получаю какую-либо выгоду от производительности, если я не использую «Статические» для своих методов?Когда использовать «Статические методы» в C#
ответ
Технически при использовании статического метода существует небольшое преимущество в производительности, так как при выполнении метода вам не нужно загружать ссылку на экземпляр для стека. Но это действительно небольшая оптимизация, которую вы не заметите.
С точки зрения программирования статические методы трудно издеваться, и они вносят сильную связь с реализацией в вашем коде. Также вы теряете преимущества абстракции и полиморфизма при использовании статических методов.
Вы можете создавать статические частные методы из методов экземпляра, которые не используют данные экземпляра. Но публичные статические методы обычно вызывают проблемы с насмешкой и зависимостью, поэтому я обычно избегаю их. Одним из исключений являются фабричные методы, которые использовались для создания экземпляров класса - Loan.CreateLongTermLoan
(таким образом, вы не можете иметь конструктор с пользовательским именем в C#, но вам нужно описательное имя, которое описывает детали созданного экземпляра) или Loan.Parse
.
Большинство моих методов взаимодействуют с База данных и передать значения обратно вызывающему абоненту. Немногие методы имеют тяжелые данные, которые передаются обратно ... Итак, будут ли они статическими делать какой-либо вред? – Abhi
Размер возвращаемых данных не влияет на тип используемых методов - статический или экземпляр. Если вы не собираетесь создавать модульные тесты для своей бизнес-логики, и вы абсолютно уверены, что всегда будете использовать один и тот же поставщик данных, тогда вы можете использовать статические методы. Ваша система будет трудно проверить, и она будет тесно связана. Но не все системы нуждаются в тестируемости и гибкости. –
Отлично. Проверка работоспособности приложения не имеет приоритета, и датапровайдер не изменится. Поэтому, я думаю, я оставлю их Static. – Abhi
Если вы беспокоитесь о преимуществах использования статических методов над методами экземпляра, то вы оптимизируете микропредставления и, без сомнения, преждевременно оптимизируете. Вы должны беспокоиться о хорошем дизайне класса, прежде чем беспокоиться об этом!
Если у вас есть методы, которые не действуют на состояние экземпляра, то они являются хорошими кандидатами на статические методы. Например, фабричные методы - это очевидное использование статических методов.
Если у вас есть методы, которые работают с состоянием экземпляра, тогда они должны быть экземплярами (нестатическими) методами. Например, метод, который изменяет переменную-член, не может быть статичным.
FYI: На уровне IL все методы экземпляра вызываются с помощью команды CallVirt, даже если они не являются виртуальными. Это позволяет среде выполнения генерировать NullReferenceException
, если вы вызываете метод по нулевой ссылке. Статический метод вызывается с помощью команды Call.
+1: для четкого ответа. –
Не могли бы вы объяснить это: «Если у вас есть методы, которые не работают с состоянием экземпляра, тогда они являются хорошими кандидатами на статические методы. Если у вас есть методы, которые работают с состоянием экземпляра, тогда они должны быть экземплярами (нестатическими) методами. "? – Abhi
@Abhi - Я добавил дополнительную информацию к ответу – Sean
Отсутствие выгоды от производительности за то, чтобы быть статичным или нет.
Если вам не нужен экземпляр класса в методе, он является кандидатом для маркировки как static
.
Проблема со статическим методом приходит в тот момент, когда вам нужен подкласс.
Статические методы нельзя переопределять в подклассах, поэтому ваши новые классы не могут обеспечить новые реализации методов, что делает их менее полезными.
Это концептуальный вопрос. Используется ли метод ...
- принадлежит к конкретному экземпляру ? Тогда это не статично.
- принадлежат к классу , а не конкретному экземпляру? Тогда это главный кандидат на статичность.
Обратите внимание, что статические методы не могут обращаться к членам экземпляра (нестатические элементы) объекта.
- 1. Когда использовать статические методы и методы класса
- 2. Когда следует использовать статические методы?
- 3. Когда следует использовать общедоступные/частные/статические методы?
- 4. Как использовать статические методы в C#
- 5. Laravel 4: Когда использовать статические методы?
- 6. Когда вы должны использовать общедоступные статические методы
- 7. Когда использовать статические классы и методы?
- 8. Когда использовать статические классы в C#
- 9. Статические методы в C++
- 10. Использовать статические методы в EL
- 11. статические абстрактные методы в C++
- 12. C# Статические методы вызовы
- 13. Когда использовать статические переменные/методы и когда использовать переменные/методы экземпляра в Java?
- 14. Статические методы vs методы экземпляра в C#
- 15. Статические абстрактные методы в C#
- 16. Как эффективно использовать статические методы?
- 17. Когда использовать статические переменные?
- 18. Когда имеет смысл использовать частные статические методы в классе экземпляра
- 19. Когда следует использовать статические методы в классе и какие преимущества?
- 20. Статические методы: когда и когда нет
- 21. Когда использовать статические атрибуты?
- 22. Можно ли использовать статические методы в классе File в C#?
- 23. PowerMock, где статические методы вызывают статические методы
- 24. Статические методы в ООП
- 25. C++ Singleton Vs статические методы
- 26. Должен ли я использовать статические методы в C#
- 27. Как часто использовать статические методы в Python
- 28. Когда вы должны использовать одноэлементный шаблон и статические методы?
- 29. PHP-как статические методы в C++ CodeBlocks
- 30. Когда использовать статические фрагменты
Этот вопрос может быть немного философским. Дело в том, что вы не можете четко ответить на этот вопрос, ничего не зная о своем программном обеспечении. – TGlatzer
Вместо преимущества - недостатком является то, что это может сделать ваш код немного сложнее для модульного тестирования. Вы не можете вводить статический класс в свой код, поэтому очень сложно насмехаться. – Paddy
Здесь есть несколько хороших ответов: http://programmers.stackexchange.com/questions/111938/which-is-a-better-practice-helper-methods-as-instance-or-static – Paddy