内部类的公共方法与内部方法

时间:2009-04-02 19:59:30

标签: c# public-method

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

  internal void Fi()
  {
    Debug.WriteLine("Fi");
  }
}

我认为Fee()和Fi()同样可以访问,因为整个类已经是内部的。我忽略了什么吗?在这种情况下,有没有理由选择公开或内部的方法?

7 个答案:

答案 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)

如果一个类是内部的,我只会使用内部方法。如果你改变主意并将课程公之于众,你就可以进行文本替换,然后就完成了。