6

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

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

4 回答 4

17

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

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

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

编译器警告 CS0628的 MSDN 条目

于 2012-01-11T15:40:53.070 回答
4

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

正如MSDN所说

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

于 2012-01-11T15:41:13.903 回答
2

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

  1. 开发人员做了一些愚蠢的事情。
  2. 开发人员做了一些太聪明的事情,因为它的目的对你来说是显而易见的。
  3. 开发人员做了一些合理的事情,但由于同时发生的变化而不再有意义。
  4. 开发人员做了一些还没有意义的事情,但如果计划中的变化发生的话。

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

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

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

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

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

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

于 2012-01-11T15:47:24.517 回答
0

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

于 2012-08-04T07:03:50.040 回答