内部类的公共与内部方法

Posted

技术标签:

【中文标题】内部类的公共与内部方法【英文标题】:public vs. internal methods on an internal class 【发布时间】:2010-10-17 05:12:29 【问题描述】:
internal class Foo

  public void Fee()
  
    Debug.WriteLine("Fee");
  

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

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

【问题讨论】:

@EricLippert 今天在博客中发表了他的观点。 ericlippert.com/2014/09/15/internal-or-public/#more-2353 【参考方案1】:

当你希望你的内部类实现一个接口时,它会有所作为。 作为某个接口的实现的方法必须是 Public。

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

【参考方案4】:

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

您可能会发现在常规 .NET 中部分信任也是如此。

【讨论】:

这些是我一直感兴趣的那种肮脏的细节。不过,通常如果有人使用反射来访问我的类中的隐藏成员,我不会担心对他们来说很难。 @ScottS - 有时你会反思你的 自己的 类型 - 即你通常可以访问内部方法的地方,但突然你没有。【参考方案5】:

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

来自 CSharp 语言规范 3.0,在 3.5.2 下:

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

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

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

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

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

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

【讨论】:

以上是关于内部类的公共与内部方法的主要内容,如果未能解决你的问题,请参考以下文章

Fragments 作为静态内部类与独立公共类的设计逻辑是啥?

关于公共内部类的问题

内部类的公共构造函数是啥意思[重复]

Java - 私有内部类的私有成员与默认成员

私有的嵌套类(内部或静态)是不是可能具有具有公共访问权限的方法?

接口设计模式内部类的初步了解