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

Nol*_*rin 61 c# class public access-modifiers internal

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

publicinternal类中internal声明的成员与在类中声明的成员之间的可见性/可用性方面是否有任何区别internal

即之间

internal class Foo
{
    public void Bar()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

internal class Foo
{
    internal void Bar()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Eri*_*ert 55

考虑这种情况:

public interface IBar { void Bar(); }
internal class C : IBar
{
    public void Bar() { }
}
Run Code Online (Sandbox Code Playgroud)

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

public class D
{
    public static IBar GetBar() { return new C(); } 
}
Run Code Online (Sandbox Code Playgroud)

  • Eric还回答了一个几乎完全相同的问题:http://stackoverflow.com/a/9302642/398015他的帖子中还有其他细节,为上面的答案增添了相当多的内容. (9认同)

Nic*_*ver 39

一个public成员仍然只是internalinternal课堂上.

来自MSDN:

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

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

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

  • “成员的可访问性永远不能大于其包含类型的可访问性。” 尽管在某些情况下确实如此,但“私有”类的“公共”成员的范围显然比“私有”类的“私有”成员的范围更广(前者是项目范围的,后者仅是类)。 (2认同)