内部类的公共与内部方法

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】:

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

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

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

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

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

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

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

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

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

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

【讨论】:

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

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

关于公共内部类的问题

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

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

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

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