c # Как проверить параметры в IDE VS2017 аналогично string.Format - PullRequest
1 голос
/ 11 марта 2019

Я заметил, что в IDE VS2017 строка, подобная следующей

string.Format("{0}: {1}, {2}, {3}, {4}", 1, 2, 3, 4);

, имеет {4}, выделенный зеленым волнистым подчеркиванием.При наведении на него отображается предупреждение «Формат строки содержит недопустимый заполнитель», указывающее, что среда IDE для VS2017 способна проверять параметры для вызова функций, таких как string.Format.

Это здорово, потому чтоЯ получаю немедленный отзыв о проблеме, пока пишу код с несоответствием между строкой формата и аргументами, а не через некоторое время во время выполнения.Однако, если я определяю свои собственные функции с аналогичными прототипами для string.Format и использующими string.Format для внутреннего использования, проверка параметров не выполняется.

class Example
{
  void ThrowException(string format, params object[] args)
  {
    throw new Exception(string.Format(format, args));
  }

  void LogMessage(int errorCode, string format, params object[] args)
  {
    throw new NotImplementedException("No logger!", new Exception(string.Format(format, args)));
  }

  void Main()
  {
    string.Format("{0}: {1}, {2}, {3}, {4}", 1, 2, 3, 4);
    ThrowException("{0}: {1}, {2}, {3}, {4}", 1, 2, 3, 4);
    LogMessage(0, "{0}: {1}, {2}, {3}, {4}", 1, 2, 3, 4);
  }
}

Main() function as it appears in IDE

Только строка с string.Format показывает ошибку проверки.Это означает, что при вызове моих пользовательских функций, требующих такой же проверки, я обнаруживаю проблему только как ошибку времени выполнения.

Я посмотрел на источник ссылки для строки. Формат , надеясь получитьсмог скопировать атрибут, который конфигурирует валидацию IDE, но не увидел там ничего релевантного, и не смог найти хорошие условия поиска, чтобы найти, если это было задано где-то в другом месте (например, поиск в Google для точного сообщения об ошибке казалось, только нашел источник Roslyn, который генерирует ошибку)

Что контролирует, выполняет ли IDE проверки такого типа в строке формата, и как бы я включил ее для своего собственного кода, такого как примеры функций

1 Ответ

0 голосов
/ 12 марта 2019

[Заполните ответ, пока кто-то другой не даст ответ, который, вероятно, будет лучше, чем этот, для последующих посетителей с похожими вопросами!]

Подводя итог, я понимаю из ответов, приведенных в комментариях:

Это невозможно в Visual Studio 2017 каким-либо достаточно очевидным способом.

Требуется написать собственный Roslyn-Analyzer (как предложено Flat Eric) или расширение Visual Studio (как предложено Chetan Ranpariya)и нет никакого способа просто проинструктировать компилятор использовать существующий анализатор, который уже написан для строки. Формат.

Вместо этого мы должны либо повторить ту же работу, которую Microsoft уже проделала для строки. Формат,для каждой функции, которая имеет схожие наборы параметров, или обходиться без одинакового уровня помощи в IDE.(Мне неясно, сколько именно работы Microsoft нужно повторить, и я не собираюсь использовать это решение, чтобы выяснить это).

JuanR также предлагает реорганизовать код на вызывающем сайте, чтобывместо этого используйте интерполяцию строк (то, о чем я только что узнал, читая этот комментарий, и, вероятно, стоит попробовать).

Я надеялся, что при разработке этой функции будут соблюдаться принципы СУХОГО, чтобы я мог просто проинструктироватькомпилятор для применения хорошо известного анализатора кода к параметрам моих функций 'format' и 'args', используя те же правила, что и эквивалентные параметры для string.Format, но это похоже на то, что еще не было встроено в систему.

...