Public and Internal members in an Internal class?

好吧,这可能是一个有点傻的问题,当然有明显的答案,但我很好奇,如果我已经错过了任何微妙的这里。

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

i.e. between

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

还有

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

如果将该方法声明为 public并声明为 virtual,然后在派生类 public中重写该方法,则使用此修饰符的原因很清楚。但是,这是唯一的情况吗... 我还漏掉了什么吗?

17806 次浏览

internal类的 public成员可以覆盖 public基类的 public成员,因此,如果是间接的,就会多一点暴露。

internal类中,public成员仍然只是 internal

来自 MSDN :

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

这样想吧,我可以访问... . ? 一个我看不到的类的 public属性:)

在这种情况下,Eric 的回答非常重要,如果它是通过接口暴露出来的,而不是直接通过 是的产生影响,这取决于您是否处于与您正在处理的成员相同的情况下。

考虑一下这个案例:

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

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

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

A commenter asked a follow-up question: is an 露骨 implementation of an interface method considered to be 公众人士, or 二等兵? (C# does not allow you to put an access modifier on an explicit implementation.)

退后一步,想想一个成员究竟是“公共”还是“私有”的: 人们会想到像 "private means that a method cannot be called from outside the class"这样的错误的东西,但这不是真的; 这个类可以将一个委托委托给一个私有方法,传递给任何人,然后他们可以调用一个私有方法。

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

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

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

刚刚面对的另一个例子中,这两者之间存在 差异,当从 XAML 在 WPF 中使用时。

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”类型不是公共或内部类型。

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