接口和部分类

时间:2010-04-10 15:52:50

标签: c# .net interface partial-classes

根据规则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();
    }
}

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

3 个答案:

答案 0 :(得分:3)

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

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

所以,我想建议尽可能经常使用隐式接口实现(在有意义的情况下)。对于显式实现,使用建议的订单可能会感觉不那么不方便。

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

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

答案 1 :(得分:1)

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

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

(因为其他比较是枚举)

在这种情况下,可以按照建议对其进行排序。我只是不会;-p(并且嵌套接口无论如何都是罕见的)

如果它意味着“显式接口实现”,那么您可以将它们放在此位置,并在内部对它们进行排序。

答案 2 :(得分:0)

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