一个内部类的公共内部方法

internal class Foo { public void Fee() { Debug.WriteLine("Fee"); } internal void Fi() { Debug.WriteLine("Fi"); } } 

我认为Fee()和Fi()是同样可以访问的,因为整个class级已经是内部的了。 我可以俯视吗? 在这种情况下,是否有任何理由select公共或内部方法?

internal class Foo声明将覆盖public void Fee()方法的可访问性,有效地使其成为内部的。

在这种情况下,在方法上使用internal和public将会有相同的效果。 在这样的情况下,我select公共方法与内部方法的唯一原因是,如果您select这样做,那么在未来版本中可以轻松过渡到公共课程。

答案中唯一缺less的是你为什么要这样做?

一些图书馆有许多类不是为图书馆的消费者所接触,而是必须inheritance标记为公共的接口。 例如,我有一个类inheritanceIComparer接口的库,但它只在内部使用,我不想混乱我的库的公共方面。 如果我将实现的Compare函数标记为内部函数,那么编译器会抱怨我没有实现接口IComparer。

那么,我该如何成功地实现接口,同时又不能在我的图书馆的公共环境中访问? 将课程标记为内​​部,但将实施的function标记为公开。

其实 – 如果你使用reflection的话,会有很大的不同。 特别是,如果您尝试通过reflection访问内部方法,即使您有权访问,Silverlight也会变得非常不安。 我已经看到了一些场合,我不得不公开一个方法来使代码在Silverlight上工作,尽pipe它在常规的.NET上工作。

你可能会发现在正则.NET中的部分信任也是一样的。

当你想让你的内部类实现一个接口的时候会有所作为。 该方法是一个接口的实现,必须是公共的。

您是正确的,费用和Fi将同样可以访问。

从3.5.2的CSharp Language Specification 3.0,

在程序P内的typesT中声明的嵌套成员M的可访问性域定义如下(注意M本身可能是一个types):

•如果M的公开可访问性,则M的可访问性域是T的可访问性域。

所以,即使费用被宣布为公开,它也会像Foo(即内部)那样可访问。

根据msdn文档,你的Foo类不会在你的程序集之外被访问,所以把这些方法标记为内部或者公共是没有任何区别的。 它通过使用Attribute InternalsVisibleTo甚至没有区别

如果一个class是内部的,我只会用内部的方法。 如果你改变了主意,并公开课,你可以做一个文本replace,你就完成了。