今天,我正在使用FXCop清理我的一些代码,它抱怨我对此违规行为的属性类。
CA1019: Define accessor for attribute argument.
在这个页面上,http://msdn.microsoft.com/en-us/library/ms182136.aspx有更多信息,但我仍然没有理由这样做,因为在我看来它更冗长,更不相关。
它提供了两个代码样本。
using System;
namespace DesignLibrary
{
// Violates rule: DefineAccessorsForAttributeArguments.
[AttributeUsage(AttributeTargets.All)]
public sealed class BadCustomAttribute :Attribute
{
string data;
// Missing the property that corresponds to
// the someStringData parameter.
public BadCustomAttribute(string someStringData)
{
data = someStringData;
}
}
// Satisfies rule: Attributes should have accessors for all arguments.
[AttributeUsage(AttributeTargets.All)]
public sealed class GoodCustomAttribute :Attribute
{
string data;
public GoodCustomAttribute(string someStringData)
{
data = someStringData;
}
//The constructor parameter and property
//name are the same except for case.
public string SomeStringData
{
get
{
return data;
}
}
}
}
我不明白为什么需要SomeStringData属性。 someStringData不是一个参数吗?如果它已经存储在另一个属性中,为什么需要拥有自己的属性?
实际上,我看起来有点不同。
[AttributeUsage(AttributeTargets.Property)]
public sealed class ExampleAttribute : Attribute
{
public ExampleAttribute(string attributeValue)
{
this.Path = attributeValue;
}
public string Name
{
get;
set;
}
// Add to add this to stop the CA1019 moaning but I find it useless and stupid?
public string AttributeValue
{
get
{
return this.Name;
}
}
}
我使用公共autoproperty而不是私有字段,我必须添加最后一部分以使警告停止,但我没有看到这一点,它还为此类添加了另一个公共字段,这是多余的,而且看起来不太干净。
那就是说,我认为这个警告是出于某种原因而提出的,所以我错过了什么理由呢?
提前致谢。
答案 0 :(得分:7)
FxCop抱怨,因为您现有的属性与参数名称不匹配 因此,它没有意识到参数实际暴露。
您应该重命名属性或参数以匹配(大小写除外),或禁止警告。
答案 1 :(得分:3)
FxCop规则CA1019只是强制实施属性的.Net Framework编码指南。
对可选参数使用命名参数(读/写属性)。提供与每个命名参数同名的读/写属性,但更改大小写以区分它们。
文档链接:http://msdn.microsoft.com/en-us/library/2ab31zeh(v=vs.71).aspx
答案 2 :(得分:2)
FxCop警告背后的原因是,当Ref正在检索属性实例时,您传递给属性构造函数的每个数据都应该公开可供访问。
假设你有这个:
[BadCustom("My String Data")]
public class DecoratedClass
{
}
当您使用以下内容阅读时,如何从该属性实例中获取"My String Data"
:
BadCustomAttribute attr = typeof(DecoratedClass)
.GetCustomAttributes(typeof(BadCustomAttribute), false)
.Single() as BadCustomAttribute;
现在您拥有属性的实例,但无法读取传递给构造函数的字符串,因为您至少没有为它声明只读属性。
答案 3 :(得分:1)
这个想法是你应该只写:
[AttributeUsage(AttributeTargets.Property)]
public sealed class ExampleAttribute : Attribute
{
public ExampleAttribute(string attributeValue)
{
this.AttributeValue = attributeValue;
}
public string AttributeValue
{
get;
set;
}
}
答案 4 :(得分:0)
当参数名称与属性名称匹配时,也会抛出此违规,但数据类型不同。