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


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

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

我认为Fee()和Fi()可以平等地访问,因为整个类已经在内部。我在俯视什么吗?在这种情况下,是否有任何理由选择公共或内部方法?


2
@EricLippert今天发表了他的意见。 ericlippert.com/2014/09/15/internal-or-public/#more-2353
ScottS 2014年

Answers:


97

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

在这种情况下,对这些方法使用内部vs.公共将具有相同的效果。在这种情况下,我选择公共方法还是内部方法的唯一原因是,如果您愿意,可以在将来的版本中轻松过渡到公共类。


36

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

一些库具有许多类,这些类并不是让库的使用者接触的,但是它们必须继承标记为public的接口。例如,我有一个带有继承IComparer接口的类的库,但该类仅在内部使用,我不想使我的库的公共方面混乱。如果我将实现的Compare函数标记为内部函数,则编译器会抱怨我没有实现IComparer接口。

那么,如何成功实现该接口并同时防止在我的库的公共方面访问该接口?将类标记为内部,但将已实现的功能标记为公共。


30

实际上-如果使用反射,则有很大的不同;特别是,如果您尝试通过反射来访问内部方法,即使您有访问权限,Silverlight也会非常不高兴。我见过一些场合,我必须公开一种方法以使代码在Silverlight上运行,即使它在常规.NET上也可以运行。

您可能会发现在常规.NET中拥有部分信任的情况。


3
这些是我一直感兴趣的肮脏细节。尽管如此,通常,如果有人使用反射来访问班级中的隐藏成员,我不会担心它们是否困难。
ScottS

1
@ScottS-有时您正在考虑自己的类型-即通常可以访问内部方法的位置,但突然之间您无法访问。
Marc Gravell

9

当您希望内部类实现接口时,它将有所作为。该方法是某些接口的实现,必须为Public。


7

您是正确的,同时可以同时使用Fee和Fi。

从CSharp语言规范3.0,在3.5.2下:

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

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

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



1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.