StyleCop Madness:受保护的领域

Efr*_*ain 4 c# inheritance stylecop protected

我尽可能地让其他人的代码符合一些StyleCop规则集.现在我想知道以下情况:

我有一个包含字段的抽象类

protected double[] coefficients;
Run Code Online (Sandbox Code Playgroud)

Stylecop说:SA1401:必须使用私人访问声明字段.使用属性公开字段.

所以我改成了:

protected double[] coefficients { get; set; } 
Run Code Online (Sandbox Code Playgroud)

Stylecop说:SA1300:属性名称以大写字母开头:系数.

由于它是一个抽象类,因此子类无法控制.他们使用他们父母的课堂base.coefficients......好吧.

那么......除了压制(或禁用)它之外没有别的办法摆脱这个警告吧?:T

Flo*_*her 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; } 
}
Run Code Online (Sandbox Code Playgroud)

在以后的版本中:

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; } 
}
Run Code Online (Sandbox Code Playgroud)


Cod*_*ray 5

即使将字段更改为属性也是一个潜在的破坏性更改。如果您必须保留与您无法控制的已编译二进制文件的兼容性,我什至不建议进行第一个更改。

关于 StyleCop,您必须记住的一点是,它顽固地坚持要求您遵循编码指南,而编码指南与规则实际上并不是一回事。您遇到的两条准则都是完全合理的。在编写新代码时我总是遵循它们。你也应该这样做。但是,如果像您的情况一样,兼容性更重要,那么可能可以忽略 StyleCop 的坚持。

即使您要解决当前的警告,您可能会遇到的下一件事(或者如果没有,它应该并且 FxCop 肯定会抓住这一点)是数组永远不应该作为接口的一部分公开(意思是,标记为protectedpublic)。相反,您应该公开类似IEnumerable<T>,IList<T>或 的内容ReadOnlyCollection<T>

冲洗,起泡沫,重复。如果你不能真正改变代码,你只是在追自己的尾巴。

只是为了看看我是否能让你更加疯狂,我会注意到,如果 FxCop 发现子类在不重写其父类的实现的情况下显式调用其父类的成员,它会大发雷霆。该成员自己。所以基本上,base.coefficients首先是不行的。如果您遵循所有指南,那么遵循它们会更容易。当然,逻辑上的推论是,如果您遵循所有指南,那么遵循它们就会变得更加困难。