我想知道public
和internal
能见度修饰符之间的区别。
我们何时应该在课堂上internal
使用public
?当方法应该是public
或internal
时,我感到很困惑。
我读到可以通过程序集访问internal
,而public
也可以通过不同之处的程序集来使用。
答案 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)
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'
,public
和internal
方法,遵循更为宽松的标准通常是合理的,因为人们可以完全控制每种方法可以接收的输入。
由于传递给protected
方法的参数(可能是从外部来源传递的参数)被认为不如从自己的程序集中接收的参数可信,因此代码分析器,而不是标记为private
的相同方法。举例来说,使用public
方法,分析器可能会警告您检查方法的参数是否不为空。使用public
方法,可以将分析器配置为对internal
进行检查时不太严格。或者,通过对程序集的所有源文件进行流分析,分析器可以自行确定public
永远不会作为参数传递给特定方法,从而确定不需要检查参数是否为internal
。分析器还有许多其他示例,它们分别处理null
和null
方法。
通过使用正确的访问修饰符正确标记类,方法,属性,字段,接口等,您可以正确地向代码分析器发出信号,表明意图,然后作为回报,分析器可以为您提供更多相关的警告消息和建议。 / p>
答案 5 :(得分:0)
此外,如果在WPF中用于DataBinding,标记为internal
的属性将抛出BindingExpression path error
。所以那些必须是public
才能正常工作,即使DataBinding发生在同一个程序集中也是如此。
答案 6 :(得分:-2)
如果您可以从外部引用汇编,则可以使用内部和公共类的范围