我尽可能地让其他人的代码符合某些StyleCop规则集。现在我想知道以下情况:
我有一个包含字段
的抽象类protected double[] coefficients;
Stylecop说: SA1401:必须使用私人访问权限声明字段。使用属性公开字段。
所以我把它改成了:
protected double[] coefficients { get; set; }
Stylecop说: SA1300:属性名称以大写字母开头:系数。
由于它是一个抽象类,因此子类无法控制。他们使用父母的班级字段base.coefficients
..好吧。
所以......除了压制(或禁用)它之外没有办法摆脱这个警告,对吧? :T
答案 0 :(得分:8)
嗯,实际上你没有。
如果要在将来的代码版本中清除它,可以设置不推荐使用coefficients
属性,并提供一条消息,指出将在任何其他版本的代码中删除此属性。
在当前版本中:
private double[] _coefficients;
// Using this property will produce a compile-time warning.
[Obsolete("coefficients will be removed in future versions. Use Coefficients instead.")]
protected double[] coefficients
{
get { return _coefficients; }
set { _coefficients = value; }
}
protected double[] Coefficients
{
get { return _coefficients; }
set { _coefficients = value; }
}
在稍后的版本中:
private double[] _coefficients;
// Using this property will produce a compile-time error.
[Obsolete("coefficients was removed. Use Coefficients instead.", true)]
protected double[] coefficients
{
get { return _coefficients; }
set { _coefficients = value; }
}
protected double[] Coefficients
{
get { return _coefficients; }
set { _coefficients = value; }
}
答案 1 :(得分:4)
即使将字段更改为属性也是一个潜在的重大变化。如果你必须保持与你无法控制的已编译二进制文件的兼容性,我甚至不建议进行第一次更改。
你必须记住关于StyleCop的事情是它坚持要求你遵循编码 指南 ,这与规则并不是一回事。你遇到的两个指导方针都是完全合理的。我总是在编写新代码时遵循它们。你也应该。但是,如果在您的情况下,兼容性更重要,那么可能会忽略StyleCop的坚持。
即使你要解决当前的警告,接下来它可能会打击你(或者如果它没有,它should,而FxCop肯定会抓住这个)是数组应该永远不会作为界面的一部分公开(意思是,标记为protected
或public
)。相反,您应该展示IEnumerable<T>
,IList<T>
或ReadOnlyCollection<T>
等内容。
冲洗,起泡,重复。如果你真的无法改变代码,那么你只是在追逐你的尾巴。
只是为了看看我是否可以让你更加疯狂,我会注意到,如果发现子类在父类中明确调用了成员,如果它们不重写,那么FxCop会抛出一个拟合该成员自己的实施。所以基本上,base.coefficients
首先是禁忌。如果您遵循所有指南,则可以更轻松地遵循这些指南。当然,逻辑上的推论是,如果你不遵循所有指导方针,那么跟随它们就会变得更加困难。
答案 2 :(得分:1)
如果将字段更改为属性,派生类(来自其他已编译的程序集)将找不到“系数”,因为属性是两种方法的快捷方式 - 不等于字段。
如果必须保持与其他程序集的兼容性,则兼容性必须是主要的,而StyleCop规则是次要目标。