Поделиться через


Общие сведения о подавлении в исходном коде

Обновлен: Ноябрь 2007

Подавление в исходном коде представляет собой возможность подавления или пропускания нарушений анализа кода при помощи атрибута SuppressMessage. Атрибут SuppressMessage является условным атрибутом, который включен в метаданные промежуточного языка сборки управляемого кода только в том случае, если символ компиляции CODE_ANALYSIS определен во время компиляции. В C++ два макроса, CA_SUPPRESS_MESSAGE и CA_GLOBAL_SUPPRESS_MESSAGE, выполняют одну и ту же функцию.

Подавление в исходном коде рекомендуется применять в отладочных или возвращаемых выпусках во избежание ошибочной поставки метаданных подавления в исходном коде и ухудшения выполнения или производительности из-за чрезмерного разрастания метаданных.

ms244717.alert_note(ru-ru,VS.90).gifПримечание.

Кодировать данные атрибуты вручную не нужно. Дополнительные сведения см. в разделе Практическое руководство. Подавление предупреждений при помощи пункта меню.

Атрибут SuppressMessage

Если щелкнуть правой кнопкой мыши предупреждение анализа кода в списке ошибок и выбрать пункт Подавить сообщения, атрибут SuppressMessage добавляется в код или в глобальный файл подавления проекта.

Атрибут SuppressMessage имеет следующий формат:

<Scope:SuppressMessage("Rule Category", "Rule Id", "Justification", "MessageId", Scope = "Scope", Target = "Target")>
[Scope:SuppressMessage("Rule Category", "Rule Id", "Justification", "MessageId", Scope = "Scope", Target = "Target")]

В данном формате:

  • Rule Category — категория, в которой определяется правило.

  • Rule Id — идентификатор правила. Поддерживается как короткое, так и полное имя идентификатора правила. Короткое имя выглядит следующим образом: CAXXXX. Полное имя выглядит следующим образом: CAXXXX:FriendlyTypeName.

  • Justification — текст причины подавления предупреждения.

  • Message Id — уникальный идентификатор проблемы для каждого сообщения.

  • Scope — объект, в рамках которого подавляется предупреждение. Если объект не задан, по умолчанию устанавливается объект атрибута. В число поддерживаемых областей входят следующие:

    • Модуль

    • Пространство имен

    • Ресурс

    • Тип

    • Член

    • Параметр

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

Использование атрибута SuppressMessage

Предупреждения анализа кода подавляются на уровне, на котором применяется экземпляр атрибута SuppressMessage. Цель такой политики заключается в тесной привязке сведений о подавлении к коду в месте нарушения.

Общая форма подавления включает категорию правила и идентификатор правила, содержащий имя правила в произвольной доступной для чтения форме. Например:

[SuppressMessage("Microsoft.Design", "CA1039:ListsAreStrongTyped")]

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

[SuppressMessage("Microsoft.Design", "CA1039")]

Данный формат не рекомендуется из соображений сопровождаемости.

Подавление нескольких нарушений внутри тела метода

Атрибуты могут применяться только к методам, но не могут быть внедрены в тело метода. Однако можно задать идентификатор в виде идентификатора сообщения для распознавания нескольких случаев нарушения внутри метода.

Imports System

Namespace InSourceSuppression
    Public Class Class1
        <System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", _
        "CA1801:ReviewUnusedParameters", MessageId:="guid")> _
        Shared Function IsValidGuid(ByVal guid As String) As Boolean
            Try
                Return True
            Catch e As ArgumentNullException
            Catch e As OverflowException
            Catch e As FormatException
            End Try

            Return False
        End Function
    End Class
End Namespace
using System;

namespace InSourceSuppression
{
    public class Class1
    {
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage",
    "CA1806:DoNotIgnoreMethodResults", MessageId = "System.Guid")]
        public static bool IsValidGuid(string guid)
        {
            try
            {
              new Guid(guid); //Causes CA1806: DoNotIgnoreMethodResults
              return true;
            }
            catch (ArgumentNullException) {}
            catch (OverflowException) {}
            catch (FormatException) {}
            return false;
        }
    }
}

Созданный код

Компиляторы управляемого кода и ряд сторонних средств создают код, упрощая и ускоряя процесс написания кода. Созданный компиляторами код, как правило, помечается в исходных файлах атрибутом GenerateCodeAttribute.

Существует возможность подавления предупреждений и ошибок анализа кода для созданного кода. Сведения о подавлении таких предупреждений и ошибок см. в разделе Свойства анализа управляемого кода.

Обратите внимание, что средство анализа кода пропускает атрибут GenerateCodeAttribute, когда он применяется к целой сборке или к отдельному параметру. Такие ситуации возникают нечасто.

Подавления на глобальном уровне

Средство анализа управляемого кода проверяет атрибуты SuppressMessage, которые применяются на уровне сборки, модуля, типа, члена или параметра. Оно также выявляет нарушения на уровне ресурсов и пространств имен. Такие нарушения должны применяться на глобальном уровне, для них задается область действия и целевые объекты. Например, следующее сообщение подавляет нарушение на уровне пространства имен:

[module: SuppressMessage("Microsoft.Design", "CA1020:AvoidNamespacesWithFewTypes", Scope = "namespace", Target = "MyNamespace")]

ms244717.alert_note(ru-ru,VS.90).gifПримечание.

При подавлении предупреждения на уровне пространства имен подавление применяется к самому пространству имен. Подавление не распространяется на типы внутри пространства имен.

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

Подавления на глобальном уровне — единственный способ подавления сообщений, относящихся к созданному компиляторами коду, который не сопоставляется с явно предоставленным исходным кодом пользователя. Например, в следующем примере кода подавляется нарушение в созданном компилятором конструкторе:

[module: SuppressMessage("Microsoft.Design", "CA1055:AbstractTypesDoNotHavePublicConstructors", Scope="member", Target="Microsoft.Tools.FxCop.Type..ctor()")]

ms244717.alert_note(ru-ru,VS.90).gifПримечание.

Целевой объект всегда содержит полное имя элемента.

Глобальный файл подавления

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

См. также

Ссылки

System.Diagnostics.CodeAnalysis