好的,所以这可能是一个有点愚蠢的问题,而且肯定有明显的答案,但我很好奇,如果我错过了这里的任何细微之处。
在public
类中声明的internal
成员与internal
类中声明的internal
成员之间的可见性/可用性方面是否存在差异?
即。之间
internal class Foo
{
public void Bar()
{
}
}
和
internal class Foo
{
internal void Bar()
{
}
}
如果您将方法声明为public
并且virtual
,然后在public
的派生类中将其覆盖,则使用此修饰符的原因很明显。然而,这是唯一的情况......我错过了别的什么吗?
答案 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
。
成员的可访问性永远不会超过其包含类型的可访问性。例如,在内部类型中声明的公共方法只具有内部可访问性
这样想,我会在....上访问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绑定,并且绑定将像往常一样对公共属性起作用。