Примените методы возврата, не являющиеся пустыми, чтобы всегда присваивать переменной или отбрасывать

#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 довольно хороши, как только вы их освоите.