2012-01-11 53 views
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()方法。 编辑:修改公共无效方法名()来保护无效方法名()

+0

如果您将'嵌套'类设为'private'会发生什么? – 2012-01-11 15:35:27

+3

我没有看到任何保护...... – 2012-01-11 15:36:23

+0

什么也没发生,警告仍然存在。我认为说实话,这与singleton设计不会有什么关系 - 它更多的是与密封类和访问修饰符有关,但我想我会提及它,并且包括嵌套类代码以防万一。 – 2012-01-11 15:36:40

回答

14

该警告是因为protected不会在不能从继承的类意义。对于sealed类,它在逻辑上与private完全相同。

这是不是一个错误,本身,但是编译器试图提请您注意的事实,使得它protected代替private将为您提供任何好处,不得做你打算什么(如果你想要它对于不能存在于密封类中的子类是可见的)。

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

MSDN入境Compiler Warning CS0628

+0

谢谢詹姆斯,我现在明白了。只是保护它免受任何儿童课程没有意义,因为它没有儿童课程。认为这可能是一些可能出错的警告,而不是毫无意义的编码。应该可能已经知道这一点。我感到困惑,因为一旦我将它改为公开,即使经过几次构建,​​警告仍然存在。谢了哥们。 – 2012-01-11 15:42:05

4

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

由于MSDN

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

2

想想自己何时检查代码。你可以看到一些毫无意义的东西。有几种可能性:

  1. 开发人员做了一些愚蠢的事情。
  2. 开发人员做了一些太聪明的事情,其目的显而易见。
  3. 开发者做了一件合理的事情,由于同时发生的变化而失去意义。
  4. 开发者做了一件毫无意义的事情,但是如果发生了计划中的变化,就会发生。

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

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

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

在第四种情况下,他们应该暂时将其记录下来,并且要么立即做出改变,要么立即退出。

无论哪种方式,你都想和他们讨论。

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

0

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