'密封类中的受保护成员'警告(单例类)

时间:2012-01-11 15:33:06

标签: c# wpf singleton sealed

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

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()

4 个答案:

答案 0 :(得分:15)

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

这本身并不是一个错误,但是编译器试图引起你注意这样一个事实,即protected而不是private将会为你提供任何好处,而不是你做的事情。意图(如果你打算让它对子类可见,那么它不能存在于密封的类中)。

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

Compiler Warning CS0628

的MSDN条目

答案 1 :(得分:4)

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

MSDN所述

  

类型声明受保护的成员,以便继承类型可以访问或   覆盖该成员。根据定义,你不能从密封继承   type,表示密封类型上的受保护方法不能   调用。

答案 2 :(得分:2)

考虑自己何时查看代码。你可以看到一些你无法理解的东西。有几种可能的可能性:

  1. 开发人员做了些蠢事。
  2. 开发人员做了一件非常聪明的事情,其目的对你来说是显而易见的。
  3. 开发人员做了一些合理的事情,由于同时发生的变化而不再有意义。
  4. 开发人员做了一些没有意义的事情,但是如果计划的改变发生了。
  5. 在第一种情况下,他们应该修复它。

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

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

    在第四种情况下,他们应该暂时对其进行记录,并且要么做出改变,要么尽早退出。

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

    这里也是一样的,将受保护的成员添加到密封的类中是没有意义的。我不知道你为什么这样做,并且无法决定上述四种情况中的哪一种适用,但其中一种情况适用。警告突出了这一点。根据四种情况中的哪一种有效,四种行为中的任何一种都适用。

答案 3 :(得分:0)

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