内部与公共在C#


92

我想知道publicinternal可见性修饰符之间的区别。

我们什么时候应该internal在课堂上使用public?当方法应该为public或时,我感到困惑internal

我读到internal可以通过程序集访问,而public也可以通过区别所在的程序集使用。

Answers:


101

public 从任何地方都可见。

internal 仅在装配体中可见

您倾向于仅使用内部来保护内部API。例如,您可以公开一个方法的几个重载:

public int Add(int x, int y)
public int Add(int x,int y, int z)

两者都调用内部方法

internal int Add(int[] numbers)

然后,您可以在方法上添加很多技巧,但是可以使用立面方法“保护”它,这可以帮助程序员正确地调用该方法。(例如,使用array参数的实现方法可以具有任意值的限制。)

同样值得注意的是,使用反射后,无论可见性如何,任何方法都可以调用。另一个“黑客”控制/获得对内部隐藏的API的访问。


5
在内部类中,我可以声明公共方法吗?
NoviceToDotNet

不可以,因为这会引起冲突。编译器会告诉您这一点,并且编译失败。
Program.X

14
@ Program.X:实际上,您可以,并且编译器不会告诉您任何内容。
OR Mapper 2014年

实际上,我来这里时是在搜索该功能是否真的有用。想象一下制作类internal和所有方法public。如果需要更高的可见性,则可以public再次将整个类设置为。但是我不确定是否打算以这种方式使用它。所以我继续谷歌搜索... 编辑
Etvoilà

31

internal当您想在DLL中声明一个成员或类型,而不是在它之外时,此函数很有用。
通常,当您声明一个成员时,因为Public您可以从其他DLL访问它。但是,如果您需要在类库内部声明要公开的内容,则可以将其声明为Internal
正式辩护:内部成员仅在当前程序集中可见...


11

internal在编写单元测试时也很有用。该InternalsVisibleTo属性让您的测试程序集访问代码程序集中的内部方法。即,您可以测试对外界似乎不公开的方法,而无需使用反射。


6

也可以在程序集外部访问Public。因此,当您拥有不应访问的类时,程序集中的每个类都应该能够访问它,那么内部是正确的事情。如果您需要外部访问,请使用public。


4

另外,标记为的属性internalBindingExpression path error在WPF中用于DataBinding 时抛出if。因此public,即使DataBinding发生在同一程序集中,也必须正常工作。


-3

如果可以从外部引用程序集,则可以使用内部类和公共类

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.