2010-04-01 36 views
50

好的,所以这可能有点愚蠢的问题,肯定有明显的答案,但我很好奇,如果我错过了这里的任何微妙之处。内部课堂中的公共和内部成员?

有一个public成员之间的可见性/易用性方面的任何差异在internal类和一个internal类中声明的internal成员声明?

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

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

如果声明的方法publicvirtual之间,然后推翻它的派生类是public,之所以用这个修改器清楚了。但是,这是唯一的情况...我错过了别的吗?

+2

_IF你声明的方法为公共的和也虚,然后推翻它是public_ ** ** meeeep派生类中:你不准提高知名度,只有倒过来:您可以创建一个派生类中的公共类,这是内部的(甚至嵌套和私人) – springy76 2012-06-26 15:48:27

+2

的Google注意到:这种近乎重复的[问题](http://stackoverflow.com/questions/9302236/why-use-a-public-method -in-an-an-an-class-class/9302642#9302642)包含另一个特别优秀的答案。 – 2014-08-04 18:02:48

回答

47

考虑这种情况:

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

谢谢埃里克,这是另一个好例子。所以有效的接口实现和类继承是允许在“内部”类中使用“public”或“internal”修饰符的原因。在其他情况下,它们看起来相当。 – Noldorin 2010-04-02 11:11:49

+8

埃里克也是在回答几乎相同的问题:http://stackoverflow.com/a/9302642/398015有在他的岗位上其他详细资料相当大的物质上面的答案补充。 – Chris 2012-12-27 15:54:22

0

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

29

A public成员在internal类中仍然只是internal

From MSDN:它

The accessibility of a member can never be greater than the accessibility of its containing type. For example, a public method declared in an internal type has only internal accessibility

这样的想法,我会访问一个public财产....?我无法看到的课程? :)

Eric的回答是在这种情况下非常重要,如果它是通过一个接口暴露,而不是将其直接确实有所作为,如果你与你处理与成员这种情况只是依赖。

+0

是的,这的确是正是我的想法,除了在埃里克指出的情况下(还有一个在我原来的问题)。 – Noldorin 2010-04-02 11:12:29

+0

当您使用反射时,它也有所不同。像Type.GetMethods()这样的默认无参数方法只返回公共成员。而内部类中的公共方法仍然知道它是公共的。 – springy76 2012-06-26 15:54:27

+1

“成员的可访问性永远不会超过其包含类型的可访问性。”同时保持对于某些情况属实,一个'一个'private'类的public'构件显然比一个''一类private'的private'构件更宽的范围(前者项目宽,只有后者是类)。 – Deanna 2014-05-15 11:47:23

1

如果涉及到反射它的事项,如果构件是公共的或不:

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

1

刚刚面临另一个例子,其中这两者之间的区别,从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, 
    } 
} 

最后一个例子产生编译错误:

error MC3064: Only public or internal classes can be used within markup. 'Bar' type is not public or internal.

不幸的是,在这种情况下,我无法解释public有什么问题。我的猜测是“仅仅因为WPF以这种方式工作”。只需将嵌套类的修饰符更改为internal即可摆脱错误。

+0

谢谢!我永远不会猜测我的XAML出了什么问题 – torvin 2017-03-13 23:39:31