Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 内部类上的公共方法与内部方法_C#_Public Method - Fatal编程技术网

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

C# 内部类上的公共方法与内部方法,c#,public-method,C#,Public Method,我认为Fee()和Fi()同样可以访问,因为整个类已经是内部的了。我是不是忽略了什么?在这种情况下,是否有任何理由选择public或internal作为方法?内部类Foo声明将覆盖public void Fee()方法的可访问性,有效地使其成为内部方法 在这种情况下,在方法上使用内部与公共将具有相同的效果。在这种情况下,我选择公共方法而不是内部方法的唯一原因是,如果您选择这样做,那么在将来的版本中可以轻松地转换到公共类。根据定义,您的Foo类在程序集之外是不可访问的,因此将方法标记为内部或公共没

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

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


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

根据定义,您的Foo类在程序集之外是不可访问的,因此将方法标记为内部或公共没有任何区别;使用InternalsVisibleTo属性也没什么区别。如果你是对的,那么费用和金融机构都可以平等访问

根据CSharp语言规范3.0第3.5.2节:

嵌套对象的可访问域 在 程序P的定义如下 (注意到M本身可能是 a类型):

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


因此,即使费用被宣布为公共的,它也将像Foo一样可访问(即内部的)。

事实上,如果您使用反射,这是一个很大的区别;特别是,如果您尝试通过反射访问内部方法,Silverlight可能会非常不安,即使您本来可以访问。我见过这样的情况:我不得不公开一个方法,使代码在Silverlight上工作,即使它在常规的.NET上工作


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

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

有些库有很多类,它们不是为了让库的使用者接触,但它们必须继承标记为public的接口。例如,我有一个库,其中包含一个继承IComparer接口的类,但它只在内部使用,我不想让库的公共方面变得混乱。如果我将实现的Compare函数标记为internal,编译器会抱怨我没有实现接口IComparer


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

如果类是internal,则只使用内部方法。如果您改变主意并公开该类,您只需执行文本替换即可。当您希望内部类实现接口时,这将产生不同。
作为某个接口实现的方法必须是公共的。

这些是我一直感兴趣的肮脏细节。不过,一般来说,如果有人在我的类中使用反射来访问隐藏成员,我不会担心这对他们来说是否困难。@ScottS-有时你在反思自己的类型,也就是说,你通常可以访问内部方法,但突然间你没有了。@EricLippert今天在博客上发表了他的观点。
internal class Foo
{
  public void Fee()
  {
    Debug.WriteLine("Fee");
  }

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