Анализатор обнаружил потенциальную ошибку при использовании функций форматирования: String.Format, Console.WriteLine, Console.Write и т.п. Строка форматирования не соответствует передаваемым в функцию фактическим аргументам.
Рассмотрим простые примеры:
Неиспользуемые аргументы.
int A = 10, B = 20;
double C = 30.0;
Console.WriteLine("{0} < {1}", A, B, C);
Не указан формат {2}, поэтому переменная 'С' не будет использована.
Возможные варианты исправленного кода:
//Удалим лишний аргумент
Console.WriteLine("{0} < {1}", A, B);
//Исправим строку форматирования
Console.WriteLine("{0} < {1} < {2}", A, B, C);
Недостаточное количество аргументов.
int A = 10, B = 20;
double C = 30.0;
Console.WriteLine("{0} < {1} < {2}", A, B);
Console.WriteLine("{1} < {2}", A, B);
Намного более опасной ситуацией является, когда в функцию передаётся меньше аргументов, чем необходимо. Это приводит к исключению FormatException.
Возможные варианты исправленного кода:
//Добавим недостающий аргумент
Console.WriteLine("{0} < {1} < {2}", A, B, C);
//Исправим индексы в строке форматирования
Console.WriteLine("{0} < {1}", A, B);
Анализатор не выдаёт предупреждение если...
int row = 10;
Console.WriteLine("Line: {0}; Index: {0}", row);
Пример ошибки в реальном приложении может выглядеть следующим образом :
var sql = string.Format(
"SELECT {0} FROM (SELECT ROW_NUMBER() " +
" OVER (ORDER BY {2}) AS Row, {0} FROM {3} {4}) AS Paged ",
columns, pageSize, orderBy, TableName, where);
В функцию передаются 5 объектов форматирования, но переменная 'pageSize' не используется, т.к. пропущен формат {1}.
Данная диагностика классифицируется как:
Взгляните на примеры ошибок, обнаруженных с помощью диагностики V3025. |