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.