根据规则SA1201,StyleCop中的元素必须以正确的顺序出现 订单如下:
Fields
Constructors
Finalizers (Destructors)
Delegates
Events
Enums
Interfaces
Properties
Indexers
Methods
Structs
Classes
一切都很好,除了Interfaces部分,因为Interface可以包含方法,事件,属性等...
如果我们想严格遵守这条规则,那么我们就不会将Interface的所有成员放在一个通常非常有用的地方。根据StyleCop帮助,可以通过将类拆分为部分类来解决此问题。
示例:
/// <summary>
/// Represents a customer of the system.
/// </summary>
public partial class Customer
{
// Contains the main functionality of the class.
}
/// <content>
/// Implements the ICollection class.
/// </content>
public partial class Customer : ICollection
{
public int Count
{
get { return this.count; }
}
public bool IsSynchronized
{
get { return false; }
}
public object SyncRoot
{
get { return null; }
}
public void CopyTo(Array array, int index)
{
throw new NotImplementedException();
}
}
这个问题还有其他好的解决方案吗?
答案 0 :(得分:3)
我认为(*)显式接口实现应该组合在一起(在事件下面),并且该规则仅适用于隐式接口实现。我认为规则是有道理的,因为如果你实现了接口隐式,它就会成为类的公共接口的一部分,所以接口的成员在逻辑上也是类的一部分(所以你不应该把它们与班上的其他人分开。)
另一方面,如果你正在使用显式实现,那么你就是说要实现接口,而不是让它成为类的一部分。在这种情况下,将它与其他成员分开是更有意义的。
所以,我想建议尽可能经常使用隐式接口实现(在有意义的情况下)。对于显式实现,使用建议的订单可能会感觉不那么不方便。
那就是说,如果你认为将界面成员组合在一起会更好,那么我可能更喜欢忽略StyleCop规则而不是使用部分类(这对我来说似乎是疯狂的解决方法)。毕竟,StyleCop给你一个建议......
(*)如果我的假设是错误的,那么我可能会忽略这个规则: - )。
答案 1 :(得分:1)
就我个人而言,我并没有看到这种规则的巨大价值,但那只是我。但听起来就像是在谈论嵌套类型(它说的是“接口”,而不是“接口实现”),即
class Foo {
//...
public interface IBar {...}
//...
}
(因为其他比较是枚举)
在这种情况下,可以按照建议对其进行排序。我只是不会;-p(并且嵌套接口无论如何都是罕见的)
如果它意味着“显式接口实现”,那么您可以将它们放在此位置,并在内部对它们进行排序。
答案 2 :(得分:0)
除了部分类或关闭该规则之外,您还可以编写自己的规则来替换该规则。