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

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

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

4

7 回答 7

99

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

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

于 2009-04-02T20:06:22.493 回答
36

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

一些库有很多类并不打算让库的使用者接触,但它们必须继承标记为公共的接口。例如,我有一个类库,该类继承了 IComparer 接口,但它只在内部使用,我不想弄乱我的库的公共方面。如果我将实现的比较函数标记为内部,编译器会抱怨我没有实现接口 IComparer。

那么我如何成功地实现接口,同时防止它在我的图书馆的公共方面被访问?将类标记为内部,但将实现的功能标记为公共。

于 2009-07-11T19:01:02.863 回答
30

实际上 - 如果您使用反射,会有很大的不同;特别是,如果您尝试通过反射访问内部方法,即使您本来可以访问,Silverlight 也会感到非常不安。我曾经见过我不得不公开一个方法以使代码在 Silverlight 上工作的情况,即使它在常规 .NET 上工作也是如此。

您可能会发现对常规 .NET 的部分信任是相同的。

于 2009-04-02T22:56:13.973 回答
9

当您希望内部类实现接口时,这会有所不同。作为某个接口的实现的方法必须是公共的。

于 2012-04-19T11:20:23.127 回答
7

你是对的,Fee 和 Fi 都可以访问。

从 CSharp 语言规范 3.0 的 3.5.2 下:

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

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

因此,即使将 Fee 声明为公开的,它也将与 Foo 一样可访问(即内部)。

于 2009-04-02T20:24:33.307 回答
3

根据msdn 文档,您的 Foo 类将无法在您的程序集之外访问,因此将方法标记为内部或公共没有任何区别;使用 Attribute InternalsVisibleTo 甚至没有任何区别

于 2009-04-02T20:07:01.010 回答
1

如果类是内部的,我只会使用内部方法。如果您改变主意并公开课程,您只需进行文本替换即可。

于 2010-12-20T09:37:55.753 回答