【问题标题】:Fields must be declared with private access. Use properties to expose fields.字段必须声明为私有访问。使用属性来公开字段。
【发布时间】:2013-05-18 11:01:10
【问题描述】:

我总是从 stylecop 收到这个警告。从班级的角度来看,这是有道理的。字段应该是私有的并使用属性来公开字段

但我有一个代码隐藏,我在其中声明了一个控件,如下所示。而且这个警告没有意义。

     /// <summary>
    /// Table used to generate the UI
    /// </summary>
    protected Table HighlightTable;

我不想让我的控件具有私有或属性并公开它。它必须受到保护。

请澄清一下。

【问题讨论】:

    标签: asp.net stylecop


    【解决方案1】:

    确实有道理,您不想将类型的内部暴露给其他子类型。

    protected 字段意味着它可以被继承者访问,因此你打破了封装——类型暴露了内部状态。您可以通过将您的字段转换为可见性受限的属性来解决此问题

    protected Table HighlightTable {get; set;}
    

    或通过限制字段的可见性

    private Table highlightTable;
    

    其他意见见类似问题here

    【讨论】:

    • 您可以拥有可以使用相同基类的替代 .aspx 文件,因此这些控制字段需要保护,而不是私有,以便其他 .aspx 可以看到它们。
    • 我不同意这一点。保护好了。在野外暴露给孩子并不是什么大不了的事。添加属性只是为了修复警告是一种愚蠢的事情。子类可能想要访问他的所有字段。即使是继承的。您通过将所有字段设为私有来破坏可重用性。不变量可以在子类中维护,如果您认为这是不可能的,很可能您有太复杂的不变量需要拆分。
    • @mathk 这只是人们采用的指导方针。维护符合某些准则的代码更容易。 stylecop 中的指南建议使用属性或私有字段。您可以不同意这一点并使用受保护的字段。并且代码仍然可以工作。问题是现在你打破了这些指导方针。对许多人来说没什么大不了的,但有些人确实在乎。一个 auto 属性并没有给代码增加太多,但使用的意图更清晰。
    【解决方案2】:

    我认为 StyleCop 是对的……该字段应该是私有的。

    为什么将 HighlightTable 标记为受保护?您是否在派生类中使用它?

    如果您没有在派生类中使用它,它应该是私有的。

    如果你在派生类中使用它,正如 SyleCop 所说,你应该创建一个属性并将 那个标记为受保护,并且你的字段应该是私有的。

    【讨论】:

    • 为什么将 HighlightTable 标记为受保护? - OP 没有,当您在 .aspx 标记中声明带有 runat="server" 的控件时,Visual Studio 会自动执行此操作。
    • 啊,是的,自从我处理 WebForms 以来已经有一段时间了......所以@Netricity 你会说 VS 在这里做错事还是 Stylecop 太迂腐了?我注意到您在其他评论中提到了多个 ASPX 文件,所以也许 Stylecop 是错误的?
    • VS 可以通过创建自动实现的受保护属性而不是字段来改进。在旧版本的 C# 中,自动实现的属性不可用,因此会生成大量代码,所以也许这就是使用受保护字段的原因。另一方面,我认为 Stylecop 应该考虑到这种行为。可以将 Stylecop 配置为忽略 .aspx.designer.cs 文件中的此类字段吗?
    猜你喜欢
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 2017-12-09
    相关资源
    最近更新 更多