c#中的内部vs公共

时间:2010-11-15 06:43:51

标签: c# .net

我想知道publicinternal能见度修饰符之间的区别。

我们何时应该在课堂上internal使用public?当方法应该是publicinternal时,我感到很困惑。

我读到可以通过程序集访问internal,而public也可以通过不同之处的程序集来使用。

7 个答案:

答案 0 :(得分:96)

从任何地方都可以看到

public

internal仅在程序集中可见

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

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

两者都调用内部方法

internal int Add(int[] numbers)

然后,您可以在方法上添加许多复杂功能,但使用Facade方法“保护”它可能有助于程序员正确调用该方法。 (例如,使用数组参数的实现方法可能具有任意的值限制。)

另外值得注意的是,使用Reflection,任何和所有方法都可以调用,无论其可见性如何。控制/获取内部隐藏API的另一个“黑客”。

答案 1 :(得分:28)

当你想在DLL中声明一个成员或类型时,

internal很有用,而不是在...之外 通常,当您将成员声明为Public时,您可以从其他DLL访问该成员。但是,如果您需要在类库中声明要公开的内容,可以将其声明为Internal
在正式的辩护中:内部成员只在当前集会内部可见......

答案 2 :(得分:9)

编写单元测试时,

internal也很有用。 InternalsVisibleTo属性允许您的测试程序集访问代码程序集中的内部方法。即您可以在不使用反射的情况下测试外部世界显示的私有方法。

答案 3 :(得分:6)

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

答案 4 :(得分:1)

通常,DurableClientAttribute方法应在鲁棒性(不会由于输入错误而导致数据崩溃或损坏)和安全意识(不允许意外输入触发利用)方面达到很高的标准。但是对于handler404 = 'mysite.views.my_custom_page_not_found_view' handler500 = 'mysite.views.my_custom_error_view' handler403 = 'mysite.views.my_custom_permission_denied_view' handler400 = 'mysite.views.my_custom_bad_request_view' publicinternal方法,遵循更为宽松的标准通常是合理的,因为人们可以完全控制每种方法可以接收的输入。

由于传递给protected方法的参数(可能是从外部来源传递的参数)被认为不如从自己的程序集中接收的参数可信,因此代码分析器,而不是标记为private的相同方法。举例来说,使用public方法,分析器可能会警告您检查方法的参数是否不为空。使用public方法,可以将分析器配置为对internal进行检查时不太严格。或者,通过对程序集的所有源文件进行流分析,分析器可以自行确定public永远不会作为参数传递给特定方法,从而确定不需要检查参数是否为internal。分析器还有许多其他示例,它们分别处理nullnull方法。

通过使用正确的访问修饰符正确标记类,方法,属性,字段,接口等,您可以正确地向代码分析器发出信号,表明意图,然后作为回报,分析器可以为您提供更多相关的警告消息和建议。 / p>

答案 5 :(得分:0)

此外,如果在WPF中用于DataBinding,标记为internal的属性将抛出BindingExpression path error。所以那些必须是public才能正常工作,即使DataBinding发生在同一个程序集中也是如此。

答案 6 :(得分:-2)

如果您可以从外部引用汇编,则可以使用内部和公共类的范围

相关问题