代码之家  ›  专栏  ›  技术社区  ›  Noldorin

内部类中的公共成员和内部成员?

  •  55
  • Noldorin  · 技术社区  · 14 年前

    好吧,这可能是一个有点愚蠢的问题,当然有一个显而易见的答案,但我很好奇我是否遗漏了这里的任何微妙之处。

    在可视性/可用性方面 public 在中声明的成员 internal 类和 内部的 在中声明的成员 内部的 班级?

    即介于

    internal class Foo
    {
        public void Bar()
        {
        }
    }
    

    internal class Foo
    {
        internal void Bar()
        {
        }
    }
    

    如果您将方法声明为 公众的 以及 virtual ,然后在派生类中覆盖它 公众的 ,使用此修改器的原因很清楚。然而,这是唯一的情况吗…我还缺什么吗?

    5 回复  |  直到 9 年前
        1
  •  51
  •   Eric Lippert    14 年前

    考虑这种情况:

    public interface IBar { void Bar(); }
    internal class C : IBar
    {
        public void Bar() { }
    }
    

    这里c.bar不能标记为内部;这样做是一个错误,因为d.getbar()的调用程序可以访问c.bar:

    public class D
    {
        public static IBar GetBar() { return new C(); } 
    }
    
        2
  •  35
  •   Nick Craver    14 年前

    public 成员仍然只是 internal 当在一个 内部的 班级。

    From MSDN :

    成员的可访问性永远不能大于其包含类型的可访问性。例如,在内部类型中声明的公共方法只有内部可访问性

    这样想,我就可以 公众的 上的属性…?我看不见的课?:)

    埃里克的回答在这种情况下非常重要,如果它是通过一个接口而不是直接暴露的话。 做一个改变,这取决于你是否和你正在交往的人处于这种情况。

        3
  •  2
  •   nevermind    9 年前

    只是面对另一个例子 这两者之间的区别,当在WPF中从XAML使用时。

    XAML:

    <Button Tag="{x:Static vm:Foo+Bar.e1}" />
    

    代码 internal 枚举编译成功:

    internal class Foo
    {
        internal enum Bar
        {
            e1,
            e2,
        }
    }
    

    但令人惊讶的是,将它改为 public 导致错误:

    internal class Foo
    {
        public enum Bar
        {
            e1,
            e2,
        }
    }
    

    最后一个示例产生编译错误:

    错误MC3064:标记“”中只能使用公共类或内部类。bar'类型不是公共的或内部的。

    不幸的是,我不能解释是什么问题 公众的 在这种情况下。我的猜测是“仅仅因为WPF是这样工作的”。只需将嵌套类的修饰符更改为 内部的 以消除错误。

        4
  •  1
  •   MaxGuernseyIII    14 年前

    public 的成员 internal 类可以重写 公众的 的成员 公众的 基本类,因此,稍微暴露一点…如果是间接的。

        5
  •  1
  •   springy76    12 年前

    如果要反映的是,成员是否公开很重要:

    例如,您甚至可以将一个嵌套的私有类传递给一个WPF绑定,并且绑定将像往常一样针对公共属性工作。