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


CA2243: синтаксический анализ строковых литералов атрибута должен осуществляться правильно

TypeName

AttributeStringLiteralsShouldParseCorrectly

CheckId

CA2243

Категория

Microsoft.Usage

Критическое изменение

Не критическое

Причина

Не удается правильно выполнить синтаксический анализ строкового литерала атрибута, представляющего URL-адрес, идентификатор GUID или версию.

Описание правила

Поскольку атрибуты наследуют от атрибута Attribute и используются во время компиляции, конструкторам можно передавать только константные значения.Параметры атрибутов, которые должны представлять URL-адреса, идентификаторы GUID или версии, не могут принадлежать типам Uri, Guid и Version, поскольку эти типы не могут представляться константами.Эти параметры должны представляться строками.

Поскольку параметр принадлежит строковому типу, во время компиляции может быть передан параметр неправильного формата.

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

Устранение нарушений

Замените строку параметра на URL-адрес, идентификатор GUID или версию правильного формата.

Отключение предупреждений

Отключение предупреждений о нарушении данного правила безопасно в том случае, если параметр не представляет URL-адрес, идентификатор GUID или версию.

Пример

В следующем примере показан код для атрибута AssemblyFileVersionAttribute, который нарушает данное правило.

using System;
using System.Runtime.InteropServices;

namespace Samples
{
    [AttributeUsage(AttributeTargets.Assembly, Inherited = false)]
    [ComVisible(true)]
    public sealed class AssemblyFileVersionAttribute : Attribute
    {
        public AssemblyFileVersionAttribute(string version) { }

        public string Version { get; set; }
    }

    // Since the parameter is typed as a string, it is possible 
    // to pass an invalid version number at compile time. The rule 
    // would be violated by the following code: [assembly : AssemblyFileVersion("xxxxx")]
}

Нарушение правила вызывается параметрами, которые

  • содержат ключевое слово "version", однако не могут быть синтаксически разобраны в соответствии с типом System.Version;

  • содержат ключевое слово "guid", однако не могут быть синтаксически разобраны в соответствии с типом System.Guid;

  • содержат ключевые слова "uri", "urn" или "url", однако не могут быть синтаксически разобраны в соответствии с типом System.Uri.

См. также

Ссылки

CA1054: параметры URI не должны быть строками