Почему Resharper предлагает const, статические операции? - PullRequest
9 голосов
/ 11 августа 2011

Мне было интересно, почему Resharper предлагает метод быть статическим в нестатическом классе? Это для сохранения создания экземпляра? Это вопрос производительности? Кроме того, почему он предлагает «const» некоторые параметры? Это вопрос производительности? Я хотел бы получить объяснение

Ответы [ 6 ]

24 голосов
/ 11 августа 2011

Когда компилятор встречает статический метод, он выдает инструкции call, но когда он встречает метод экземпляра, он испускает инструкцию callvirt.Теперь инструкция callvirt проверяет, является ли объект нулевым, перед выполнением вызова.таким образом, к нему прикреплено снижение производительности. Но это помогает сделать полиморфный вызов метода.

, поэтому, если метод не связан с изменением состояния какого-либо свойства класса, рекомендуется сделать этоМетод static, поскольку он улучшает производительность

Что касается использования const, то это сопоставление значения во время компиляции, а не во время выполнения.поэтому все переменные const заменяются значением во время компиляции, что, очевидно, повышает производительность.

10 голосов
/ 11 августа 2011

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

4 голосов
/ 11 августа 2011

Другие ответы верны, это просто хорошая практика.

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

Он также может иметь цепную реакциюТип эффекта - скажем, A вызывает B, оба нестатические.Теперь Решарпер говорит нам, что B можно сделать статичным;мы позволяем этому делать свое дело.Теперь, возможно, А тоже можно сделать статичным.Может быть, A также совсем другая ответственность.

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

2 голосов
/ 11 августа 2011

Статический класс не требует экземпляра для вызова этого класса, и Re sharper достаточно умен, чтобы понять, что метод может быть статическим, чтобы люди могли использовать этот метод без экземпляра.

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

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

1 голос
/ 11 августа 2011

Это происходит потому, что он обнаруживает, что в теле метода не используются переменные-члены класса.

0 голосов
/ 20 сентября 2016

На самом деле, я бы зашел так далеко, чтобы сказать, что JetBrains должен удалить их настройки по умолчанию для внесения предложений, чтобы они имели постоянное статическое чтение только для чтения.Читайте здесь: https://www.exceptionnotfound.net/const-vs-static-vs-readonly-in-c-sharp-applications/

Сводка о том, что переменные Const ОЧЕНЬ грязны, когда вы имеете дело с несколькими сборками.Если сборка A имеет const X, а сборка B использует эту X. Тогда сборка B ДОЛЖНА быть перекомпилирована КАЖДОЕ время сборки A изменяет это значение X.Это просто дает вам возможную головную боль, которую вы не хотите!

Когда дело доходит до скорости?ну ... компилятор пошел очень хорошо и очень умный.Скорость, которую вы получаете от const, незначительна в долгосрочной перспективе.

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