72

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

在类中声明的成员和public在类中声明的成员之间在可见性/可用性方面有什么区别吗?internalinternalinternal

即介于

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

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

如果将方法声明为publicand virtual,然后在派生类中覆盖它,那么public使用这个修饰符的原因就很清楚了。但是,这是唯一的情况……我是否还缺少其他东西?

4

5 回答 5

64

考虑这种情况:

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(); } 
}

一位评论者提出了一个后续问题:接口方法的显式实现被认为是public还是private?(C# 不允许您在显式实现上放置访问修饰符。)

退一步想一想成员的“公共”或“私有”到底是什么:人们认为错误的东西,例如“私有意味着不能从类外部调用方法”,但事实并非如此;该类可以委托私有方法,将其传递给任何人,然后他们可以调用私有方法。

相反,可访问性决定了可以在哪里使用事物的名称!显式接口实现首先不会将名称添加到类声明空间;它们只能通过接口按名称引用,而不是类。将显式接口实现视为公共私有的确实没有意义,因为它们没有您可以引用的名称。

于 2010-04-01T23:23:27.963 回答
46

public成员仍然只是在上课internal时。internal

来自 MSDN

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

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

在这种情况下,Eric 的回答非常重要,如果它是通过接口而不是直接公开的,它确实会产生影响,这取决于您是否与正在处理的成员处于这种情况。

于 2010-04-01T23:18:12.690 回答
2

public类的成员internal可以覆盖基类public的成员public,因此,如果是间接的,则暴露得更多一些。

于 2010-04-01T23:16:34.177 回答
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:标记中只能使用公共或内部类。“酒吧”类型不是公共的或内部的。

不幸的是,我无法解释public在这种情况下出了什么问题。我的猜测是“只是因为 WPF 那样工作”。只需更改嵌套类的修饰符internal即可消除错误。

于 2015-10-08T14:59:55.403 回答
1

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

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

于 2012-06-26T15:57:15.057 回答