我已经实现了一个单例类,并且不断收到警告,我正在编写的方法是一个'在密封类中声明的新受保护成员'。它不会影响构建,但我真的不想忽略警告,以防以后出现问题?我理解一个密封类是一个不能被继承的类 - 所以它的方法不能被覆盖,但我仍然不明白为什么下面的代码会给我警告(是因为使用了单例设计?):
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()
答案 0 :(得分:15)
警告是因为protected
在无法继承的类中没有意义。对于private
类,它在逻辑上与sealed
完全相同。
这本身并不是一个错误,但是编译器试图引起你注意这样一个事实,即protected
而不是private
将会为你提供任何好处,而不是你做的事情。意图(如果你打算让它对子类可见,那么它不能存在于密封的类中)。
所以,是的,您可以放心地忽略它,但在protected
类中拥有sealed
成员在逻辑上是不一致的。
答案 1 :(得分:4)
很明显,因为它没有任何意义。如果继承类不能使用受保护的成员
如MSDN所述
类型声明受保护的成员,以便继承类型可以访问或 覆盖该成员。根据定义,你不能从密封继承 type,表示密封类型上的受保护方法不能 调用。
答案 2 :(得分:2)
考虑自己何时查看代码。你可以看到一些你无法理解的东西。有几种可能的可能性:
在第一种情况下,他们应该修复它。
在第二种情况下,他们应该记录下来。
在第三种情况下,他们应该改变它;它没有什么实际意义,但代码会更有意义,它可能会有一些小的性能优势。
在第四种情况下,他们应该暂时对其进行记录,并且要么做出改变,要么尽早退出。
无论哪种方式,你都希望与他们讨论。
这里也是一样的,将受保护的成员添加到密封的类中是没有意义的。我不知道你为什么这样做,并且无法决定上述四种情况中的哪一种适用,但其中一种情况适用。警告突出了这一点。根据四种情况中的哪一种有效,四种行为中的任何一种都适用。
答案 3 :(得分:0)
我说你正在玩C#。说真的!!
在静态类中,据说我们不能声明受保护的成员,因为静态类无法实例化。实际上,当我们在静态类中编写受保护的成员时,它会在构建期间抛出错误
在密封的类中,它会在构建期间发出警告。我想像静态类,密封类也应该给出错误而不是警告。如果存在这种差异那么为什么呢?