Подтвердить что ты не робот

Должен ли я ставить свои методы приватного класса?

Есть ли лучшая практика для создания частных методов в классах static? У меня есть класс с несколькими методами. Некоторые из них могут быть легко сделаны статическими, поскольку они просто обрабатывают данные.

Должен ли я сделать их статическими или просто оставить их как есть? Это больше проблема стиля? Есть ли соображения производительности?

Edit: Метод может быть сделан статическим, но должен ли он?

4b9b3361

Ответ 1

Если методы не имеют доступа к состоянию какого-либо типа, они должны быть статическими.

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

Увеличение производительности статического метода происходит из-за того, что компилятор не должен генерировать команды callvirt для вызова статического метода. Команда callvirt удобна для вызовов экземпляров тем, что перед вызовом метода выполняет проверку null. Однако при вызове статических методов нет необходимости проверять null, чтобы компилятор мог испускать более быструю инструкцию call, которая не проверяет null.

Ответ 2

Как говорит Дэн Дипло, если они могут стать статичными, они должны быть статичными. Это справедливо только для частных статических методов (о чем вы просили). Однако для общедоступных методов они просто путают пользователей вашего класса. Публичные методы должны быть статичными только в том случае, если они будут использоваться без экземпляра класса вызывающими, потеря производительности при их не статике будет проклята.

Ответ 3

Я всегда думаю, что если они могут быть сделаны статическими (и компилятор скоро сообщит вам, если они не смогут), тогда они должны быть сделаны так. См. Этот повторяющийся вопрос для дальнейшего обсуждения.

Ответ 4

Я делаю только статические методы, когда уверен, что у них нет никаких побочных эффектов.

Ответ 5

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

Любые различия в производительности не должны вызывать беспокойства. Конечно, есть разница в том, как вызывается статический метод и метод экземпляра, но вы, скорее всего, не сможете измерить какую-либо согласованную разницу в производительности. Разница настолько мала, что иногда вызов метода экземпляра может быть быстрее, только потому, что инструкции выполняются, чтобы лучше соответствовать выполнению.

Ответ 6

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

Ответ 7

Подумайте о статических методах и многопоточности. Вы должны быть очень осторожны. Эта дискуссия похожа на определение шаблона: "решение проблемы в некотором контексте". Вы не должны говорить: "Это должно быть сделано так". Это зависит от контекста.

Ответ 8

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