2

根据 StyleCop 中的规则 SA1201,类中的元素必须以正确的顺序出现。
顺序如下:

 Fields  
 Constructors  
 Finalizers (Destructors)  
 Delegates  
 Events  
 Enums  
 Interfaces  
 Properties  
 Indexers  
 Methods  
 Structs  
 Classes 

一切都很好,除了接口部分,因为接口可以包含方法、事件、属性等……
如果我们想严格遵守这条规则,那么我们不会将接口的所有成员都放在一个地方,这通常非常有用。根据 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();
    }
}

这个问题还有其他好的解决方案吗?

4

3 回答 3

3

我想(*)应该将显式接口实现组合在一起(在事件下方),并且该规则仅适用于隐式接口实现。我认为这条规则是有道理的,因为如果你隐式地实现接口,它就会成为类的公共接口的一部分,所以接口的成员在逻辑上也是类的一部分(所以你不应该将它们与班级的其他人分开)。

另一方面,如果你使用显式实现,你就是说你想实现接口,而不是让它成为类的一部分。在这种情况下,将其与其他成员分开会更有意义。

所以,我想建议是尽可能多地使用隐式接口实现(在有意义的情况下)。对于显式实现,使用建议的顺序可能感觉不那么方便。

也就是说,如果您认为将接口的成员组合在一起更好,那么我可能更愿意忽略 StyleCop 规则而不是使用部分类(这对我来说似乎是疯狂的解决方法)。毕竟,StyleCop 只是给你一个建议......

(*) 如果我的假设是错误的,那么我可能会忽略规则:-)。

于 2010-04-10T16:12:07.207 回答
1

就个人而言,我认为这种规则没有巨大的价值,但这只是我。但这听起来像是在谈论嵌套类型(它说的是“接口”,而不是“接口实现”),即

class Foo {
    //...
    public interface IBar {...}
    //...
}

(因为另一个比较是枚举)

在这种情况下,您可以按照它的建议订购。我只是不会;-p(无论如何嵌套接口都很罕见)

如果它意味着“显式接口实现”,那么您可以将它们放在这个位置并按照已经定义的方式在内部订购它们。

于 2010-04-10T16:10:23.230 回答
0

除了部分类或关闭该规则之外,您还可以编写自己的规则来替换该规则。

于 2010-04-10T17:58:54.967 回答