内部课程中的公共和内部成员?

时间:2010-04-01 23:14:22

标签: c# class public access-modifiers internal

好的,所以这可能是一个有点愚蠢的问题,而且肯定有明显的答案,但我很好奇,如果我错过了这里的任何细微之处。

public类中声明的internal成员与internal类中声明的internal成员之间的可见性/可用性方面是否存在差异?

即。之间

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

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

如果您将方法声明为public并且virtual,然后在public的派生类中将其覆盖,则使用此修饰符的原因很明显。然而,这是唯一的情况......我错过了别的什么吗?

5 个答案:

答案 0 :(得分:52)

考虑这种情况:

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

这里C.Bar不能标记为内部;这样做是一个错误,因为C.Bet可以被D.GetBar()的调用者访问:

public class D
{
    public static IBar GetBar() { return new C(); } 
}

答案 1 :(得分:37)

public成员在internal课程时仍然只是internal

From MSDN

  

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

这样想,我会在....上访问public属性?我看不到的课程? :)

在这种情况下,Eric的答案非常重要,如果它是通过界面暴露而不是直接 有所作为,那取决于你是否处于与你正在交易的成员的情况用。

答案 2 :(得分:2)

刚刚面对另一个例子,当在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:在标记中只能使用公共或内部类。 &#39;酒吧&#39;类型不是公开的或内部的。

不幸的是,在这种情况下,我无法解释public的错误。我的猜测是&#34;只是因为WPF以这种方式工作&#34;。只需将嵌套类的修饰符更改为internal即可消除错误。

答案 3 :(得分:1)

public类的{p> internal成员可以覆盖public个基类的public个成员,因此,如果是间接的话,会更加暴露......

答案 4 :(得分:1)

如果涉及反思,那么会员是否公开就很重要:

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