内部class级的公共和内部成员?
好吧,这可能有点愚蠢的问题,当然有明显的答案,但我很好奇,如果我错过了这里的任何微妙之处。
在internal
阶层申报的public
成员与internal
阶层申报的internal
成员之间的可见性/可用性方面是否有区别?
即之间
internal class Foo { public void Bar() { } }
和
internal class Foo { internal void Bar() { } }
如果你将这个方法声明为public
并且是virtual
,然后在一个派生类中public
,那么使用这个修饰符的理由是很清楚的。 但是,这是唯一的情况…我错过了别的吗?
考虑这种情况:
public interface IBar { void Bar(); } internal class C : IBar { public void Bar() { } }
这里C.Bar不能标记为内部; 这样做是错误的,因为C.Bar可以被D.GetBar()的调用者访问:
public class D { public static IBar GetBar() { return new C(); } }
public
成员在internal
课堂上还是internal
。
来自MSDN :
成员的可访问性永远不会超过其包含types的可访问性。 例如,以内部types声明的公共方法只有内部可访问性
想想这样,我会访问public
财产….? 我无法看到的课程? 🙂
埃里克的答案在这种情况下是非常重要的,如果通过界面暴露出来,而不是直接影响, 那么取决于你是否处于与你打交道的成员的状况。
如果涉及到反思,那么这个成员是否公开是重要的。
例如,你甚至可以传递一个嵌套的私人类到一个WPF绑定,绑定将像往常一样针对公共属性。
刚刚面对另一个例子,这两个之间的差异,从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:标记内只能使用公共或内部类。 “酒吧”types不是公开的或内部的。
不幸的是,在这种情况下,我无法解释public
的问题。 我的猜测是“只是因为WPF的工作方式”。 只要将嵌套类的修饰符更改为internal
即可摆脱错误。
一个internal
类的public
成员可以重写public
基础类的public
成员,因此,如果是间接的话,会更加暴露一些。