internal class Foo
{
public void Fee()
{
Debug.WriteLine("Fee");
}
internal void Fi()
{
Debug.WriteLine("Fi");
}
}
我认为Fee()和Fi()同样可以访问,因为整个类已经是内部的。我忽略了什么吗?在这种情况下,有没有理由选择公开或内部的方法?
答案 0 :(得分:95)
internal class Foo
声明将覆盖public void Fee()
方法的辅助功能,有效地使其成为内部。
在这种情况下,对方法使用internal vs. public将产生相同的效果。在这样的情况下,我选择公共方法与内部方法的唯一原因是,如果您选择这样做,将在未来版本中轻松过渡到公共类。
答案 1 :(得分:35)
答案中唯一缺少的是你为什么要这样做?
有些库有很多类,这些类不适合要触摸的库的使用者,但是它们必须继承标记为public的接口。例如,我有一个带有继承IComparer接口的类的库,但它只在内部使用,我不想混淆我的库的公共方面。如果我将已实现的Compare函数标记为内部,则编译器会抱怨我没有实现接口IComparer。
那么我如何成功实现该界面,同时防止它在我的图书馆的公共方面被访问?将该类标记为内部,但将已实现的函数标记为public。
答案 2 :(得分:28)
实际上 - 如果你使用反射会有很大的不同;特别是,如果您尝试通过反射访问内部方法,Silverlight可能会非常沮丧,即使您有访问权限也是如此。我已经看到过必须公开方法以使代码在Silverlight上运行的情况,即使它适用于常规.NET。
您可能会在常规.NET中找到与部分信任相同的内容。
答案 3 :(得分:8)
当您希望内部类实现接口时,它会有所不同。 作为某个接口的实现的方法必须是Public。
答案 4 :(得分:7)
您说得对,费用和费用都可以同等使用。
来自CSharp语言规范3.0,3.5.2以下:
嵌套的可访问性域 成员M在一个类型T中声明 程序P定义如下 (注意到M本身可能是 a):
•如果申报 M的可访问性是公开的 M的可访问域是 T的可访问性域。
因此,即使费用被宣布为公开,也会像Foo一样(即内部)。
答案 5 :(得分:3)
根据msdn documentation你的Foo类在你的程序集之外是不可访问的,所以将这些方法标记为内部或公共没有任何区别;它甚至没有通过使用Attribute InternalsVisibleTo
来改变答案 6 :(得分:1)
如果一个类是内部的,我只会使用内部方法。如果你改变主意并将课程公之于众,你就可以进行文本替换,然后就完成了。