【问题标题】:'Protected member in sealed class' warning (a singleton class)“密封类中的受保护成员”警告(单例类)
【发布时间】:2012-02-07 23:13:29
【问题描述】:

我已经实现了一个单例类,并不断收到警告说我正在编写的方法是“在密封类中声明的新受保护成员”。它不会影响构建,但我真的不想忽略警告,以防它在以后引起问题?我知道密封类是一个不能被继承的类 - 所以它的方法不能被覆盖,但我仍然不明白为什么下面的代码会给我警告(是因为使用了单例设计吗?):

namespace WPFSurfaceApp
{
public sealed class PresentationManager
{
    PresentationManager()
    {
    }

    protected void MethodName()
    {
    }

    public static PresentationManager Instance
    {
        get
        {
            return Nested.instance;
        }
    }

    class Nested
    {
        // Explicit static constructor to tell C# compiler
        // not to mark type as beforefieldinit
        static Nested()
        {
        }

        internal static readonly PresentationManager instance = new PresentationManager();
    }
}

编辑:警告与 MethodName() 方法有关。 编辑:将 public void MethodName() 更改为 protected void MethodName()

【问题讨论】:

  • 如果您将Nested 类设为private,会发生什么?
  • 我没有看到任何受保护的东西......
  • 什么也没发生,警告仍然存在。老实说,我认为它与单例设计没有任何关系 - 它更多地与密封类与访问修饰符有关,但我想我会提到它并包含嵌套类代码以防万一。
  • 我遗漏了一些东西,您的示例代码没有收到任何警告。
  • 我也是,您的所有工件都是私有的、公共的和来自您的源的内部的。您粘贴的代码是否与给您警告的代码相同?您是否保护了构造函数?

标签: c# wpf singleton sealed


【解决方案1】:

我说你在玩 C#。说真的!!
在静态类中,据说我们不能声明受保护的成员,因为静态类不能被实例化。事实上,当我们在静态类中编写受保护的成员时,它会在构建过程中抛出错误。
在密封类中,它会在构建过程中引发警告。我想像静态类一样,密封类也应该给出错误而不是警告。如果应该存在这种差异,那为什么?

【讨论】:

    【解决方案2】:

    想想你自己审查代码的时候。就你所见,你会看到一些毫无意义的东西。有几种可能:

    1. 开发人员做了一些愚蠢的事情。
    2. 开发人员做了一些过于聪明的事情,以至于其目的对您来说是显而易见的。
    3. 开发人员做了一些合理的事情,但由于同时发生的变化而不再有意义。
    4. 开发人员做了一些目前还没有意义的事情,但如果发生计划中的更改就会这样做。

    在第一种情况下,他们应该修复它。

    在第二种情况下,他们应该记录它。

    在第三种情况下,他们应该改变它;它不会产生什么实际影响,但代码会更有意义,并且可能会有一些小的性能优势。

    在第四种情况下,他们应该暂时记录下来,然后要么进行更改,要么尽早退出。

    无论哪种方式,您都希望与他们讨论。

    这里也一样,给一个密封的类添加一个受保护的成员是没有意义的。我不知道您为什么这样做,也无法确定上述四种情况中的哪一种适用,但其中一种适用。警告强调了这一点。根据四种情况中的哪一种有效,执行四种行动中的哪一种。

    【讨论】:

      【解决方案3】:

      这很明显,因为它没有任何意义。如果类不能被继承,受保护的成员有什么用

      正如MSDN 所说

      类型声明受保护的成员,以便继承类型可以访问或 覆盖成员。根据定义,您不能从密封的 类型,这意味着密封类型上的受保护方法不能 调用。

      【讨论】:

        【解决方案4】:

        警告是因为protected 在无法继承的类中没有意义。对于sealed 类,它在逻辑上与private 完全相同。

        这本身并不是一个错误,但编译器试图提醒您注意这样一个事实,即使用 protected 而不是 private 不会给您带来任何好处,并且可能不会按照您的意愿行事(如果您旨在它对子类可见,而子类不能存在于密封类中)。

        所以,是的,您可以放心地忽略它,但是在 sealed 类中拥有 protected 成员在逻辑上是不一致的。

        Compiler Warning CS0628 的 MSDN 条目

        【讨论】:

        • 谢谢詹姆斯,我现在明白了。只是保护它不受任何子类的影响是没有意义的,因为它不会有一个。认为这可能是对可能出错的事情的警告,而不是毫无意义的编码。应该早就知道了。我很困惑,因为一旦我将其更改为公开警告仍然存在,即使经过几次构建也是如此。谢谢老兄。
        猜你喜欢
        • 1970-01-01
        • 2015-07-16
        • 2019-12-05
        • 2014-06-19
        • 2017-08-01
        • 2016-10-01
        • 2018-02-11
        • 2012-12-01
        相关资源
        最近更新 更多