【问题标题】:Static class declaring a protected member声明受保护成员的静态类
【发布时间】:2011-09-27 08:25:37
【问题描述】:

我正在阅读这本书 "C# Language",并点击了 Vladimir Reshetnikov 的这篇笔记:

如果一个静态类声明一个受保护或 受保护的内部成员,发生编译时错误 (CS1057)。

我可以知道为什么吗? 具有受保护成员的静态类有什么问题? 静态类可以有私有成员,所以我猜这个 CS1057 错误不是由于可访问性,而是可能是由于编译问题?作为受保护的成员可以在子类中被覆盖......但我不知道为什么。

【问题讨论】:

    标签: c# compiler-errors static-classes


    【解决方案1】:

    因为您不能继承静态类,protected 没有用处 - 只有 publicprivate 在这里有意义。

    更多详情可以在这里找到:Why can't I inherit static classes?

    【讨论】:

    • 这是隐含的,但我认为值得在您的回答中明确说明private 成员可以。
    • @tehDorf 在问题本身中提到:“静态类可以有私有成员” - 抱歉,但看不出将其添加到答案中的意义。
    • @ShadowWizard 啊,对不起,我错过了。我被谷歌链接到这里,不知道私人成员是被允许的,我也没有一路阅读他的帖子。谢谢你的回答。
    【解决方案2】:

    受保护的成员意味着可以从子类/派生类访问它们。但是静态类的主要特点是:

    1. 只包含静态成员;

    2. 无法实例化;

    3. 已密封。

    这就是静态类不能有受保护成员的原因。

    【讨论】:

      【解决方案3】:

      .NET 中的继承仅适用于实例库。静态方法是在类型级别而不是在实例级别定义的。这就是为什么覆盖不适用于静态方法/属性/事件...

      静态方法只在内存中保存一次。没有为他们创建的虚拟表等。

      如果您在 .NET 中调用实例方法,则始终为其提供当前实例。这被 .NET 运行时隐藏了,但它确实发生了。每个实例方法都有一个指向运行该方法的对象的指针(引用)作为第一个参数。静态方法不会发生这种情况(因为它们是在类型级别定义的)。编译器应该如何决定选择调用的方法?

      (小家伙)

      【讨论】:

        猜你喜欢
        • 2012-05-20
        • 2014-01-30
        • 2011-05-15
        • 2013-11-30
        • 2015-06-30
        • 2015-06-14
        • 1970-01-01
        • 2016-07-05
        • 1970-01-01
        相关资源
        最近更新 更多