【问题标题】:Interface and partial classes接口和部分类
【发布时间】:2010-04-10 15:52:49
【问题描述】:

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

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

一切都很好,除了接口部分,因为接口可以包含方法、事件、属性等...
如果我们想严格遵守这条规则,那么我们就不会将 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();
    }
}

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

【问题讨论】:

    标签: c# .net interface partial-classes


    【解决方案1】:

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

    另一方面,如果您使用显式实现,则表示您希望实现接口,而不是使其成为类的一部分。在这种情况下,将其与其他成员分开会更有意义。

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

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

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

    【讨论】:

    • 我认为您在第 2 段中谈论的是显式(非隐式)实现 - 可能是错字?
    • 同意,我认为拆分班级更糟糕。部分类确实作为 IDE 的工具存在(例如带有 ASP.NET 页面和代码隐藏的 VS)。
    【解决方案2】:

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

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

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

    在这种情况下,您可以按照它的建议订购它。我只是不会 ;-p (而且嵌套接口还是很少见的)

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-05
        相关资源
        最近更新 更多