#c# #resharper
#c# #resharper
Вопрос:
Часто у меня есть фрагменты кода, которые выглядят следующим образом:
private void OnChangeLanguageCommandExecuted(object obj)
{
pLngService.ChangeLanguage(newLcid);
}
В этом случае ChangeLanguage(...)
метод возвращает значение, хотя это значение (true для успеха, false для неуспеха) не используется. Проблема в том, что при просмотре кода я понятия не имел, что этот метод возвращает значение.
Я не писал этот метод и не контролирую его.
Поэтому я хотел бы глобально применять политику, в которой:
Каждому методу, не являющемуся пустым, должна быть присвоена переменная, например var unused = pLngService.ChangeLanguage(newLcid);
Или следует использовать оператор отбрасывания, чтобы сделать его более явным: _ = pLngService.ChangeLanguage(newLcid);
Я, конечно, открыт для других предложений, основная цель здесь — сделать более подробным, что оба метода возвращают значение и что я выбираю его отбросить.
Я надеялся, что для Visual studio или Resharper будет правило, в котором я мог бы использовать эту политику, генерируя предупреждения компилятора. Я не хотел бы делать это ошибкой компилятора, которая кажется строгой. Я быстро огляделся, но не нашел ничего oob, но я чувствую, что я что-то упускаю из виду.
Я использую проекты в vs2017 (net4) и vs2019 (net8 / netcore3.0), поэтому было бы здорово использовать что-то, что работало бы в любой из этих настроек.
РЕДАКТИРОВАТЬ: я узнал, буквально во время написания анализатора кода roslyn, что, по-видимому, вы можете настроить это с помощью https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0058
Исправления кода были именно тем, что я искал:
// Original code:
System.Convert.ToInt32("35");
// After code fix for IDE0058:
// csharp_style_unused_value_expression_statement_preference = discard_variable
_ = System.Convert.ToInt32("35");
// csharp_style_unused_value_expression_statement_preference = unused_local_variable
var unused = Convert.ToInt32("35");
Существует следующее правило:
csharp_style_unused_value_expression_statement_preference
С параметрами:
Значения параметра discard_variable — предпочитают присваивать неиспользуемое выражение отбрасыванию
unused_local_variable — предпочитает присваивать неиспользуемое выражение локальной переменной, которая никогда не используется
Комментарии:
1. См. github.com/dotnet/csharplang/issues/432
2. Какую проблему вы решаете, применяя такое правило? Проще просмотреть код? Что-то еще? Я лично не вижу проблемы, если возвращаемое значение игнорируется. Так работает C # с 2002 года.
3. @canton7 Интересная тема, спасибо. Что касается имени метода, еще раз, это не под моим контролем, поэтому я полностью согласен, что вся используемая мной платформа полна методов с неправильными именами, но я не могу это изменить. вот почему мне нужна политика, о которой я говорил…
4. @Sinatr Я еще не видел этого атрибута, хорошее предложение. Однако у меня все еще нет контроля над множеством методов, которые я вызываю (они находятся в другой, запутанной dll), так что не повезло.
5. @canton7 Я также не вижу доступных анализаторов roslyn. Однако они кажутся достаточно простыми для написания, так что, возможно, я возьмусь за это как за проект выходного дня, если у меня будет время. Уже существуют анализаторы, позволяющие избежать асинхронных методов void, поэтому их должно быть легко адаптировать оттуда, например github.com/TheAlmightyBob/AsyncVoidAnalyzer/blob/master /…
Ответ №1:
Для будущих читателей, пожалуйста, обратитесь к кодовому правилу IDE0058: https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0058 Также смотрите: https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/code-style-rule-options?view=vs-2019 о том, как настроить правила редактора.
Что должно обеспечить то, что вам нужно. Если это недоступно или правило не работает в вашей конкретной версии VS, вы также можете взглянуть на этот быстрый анализатор roslyn, который я сделал в субботу утром:
https://github.com/sommmen/DiscardReturnValueAnalyzer/tree/master
Она работает, но все еще есть некоторые вещи, которыми я недоволен, например, фактические аналитические сообщения. Но поскольку IDE0059 уже должен охватывать этот вариант использования, я не прилагаю к этому больше усилий. Если вам это нужно по какой-то причине, не стесняйтесь создавать проблему, и я мог бы взглянуть.
Также репозиторий не опубликован или что-то в этом роде, поэтому вам придется клонировать и создавать его самостоятельно.
P.s. Анализаторы Roslyn довольно хороши, как только вы их освоите.