我想了解在IT技术中,public
和internal
访问修饰符之间的区别。
在类中何时应该使用internal
,何时应该使用public
?我对方法何时应该是public
或internal
感到困惑。
我了解到internal
可以通过程序集进行访问,而public
也可以通过程序集进行使用。 那么它们的区别在哪里?
public
表示可以从任何位置访问。
internal
则只能在一个程序集内访问。
通常情况下,我们使用internal来保护内部的API。例如,你可以暴露一个方法的多个重载:
public int Add(int x, int y)
public int Add(int x,int y, int z)
两者都调用了内部方法:
internal int Add(int[] numbers)
你可以在一个方法上添加很多复杂的东西,但通过使用门面方法“保护”它,可以帮助程序员正确地调用该方法。(例如,带有数组参数的实现方法可能具有任意值的限制。)
还值得注意的是,使用反射,无论其可见性如何,都可以调用任何方法。这是控制/访问内部隐藏API的另一种“黑客”方式。
internal
对于想要在 DLL 内部声明成员或类型而不是在外部声明的情况非常有用。
通常,当你将成员声明为 public
时,你可以从其他 DLL 中访问它。但是,如果你需要将某些东西声明为仅在类库内部公开,则可以将其声明为 internal
。
在正式的定义中,internal
成员仅在当前程序集内可见。
internal
在编写单元测试时非常有用。 InternalsVisibleTo
属性允许测试程序集访问代码程序集中的内部方法。也就是说,您可以测试外部世界认为是私有的方法,而不必使用反射。
公共(Public)也可以在程序集外部访问。因此,当您有一个类不应该被所有程序集中的类都能访问时,请使用 internal。如果需要从外部访问,则使用 public。
public
方法应该符合非常高的健壮性标准(不会因为错误输入而导致崩溃或破坏数据)和安全意识标准(不允许意外的输入触发漏洞利用)。但对于internal
、protected
和private
方法,通常可以遵循更为宽松的标准,因为每个方法都有完全控制自身接收的输入。public
方法传递的参数(可能来自外部源)被认为比从代码程序集内部接收到的参数不够可信,所以标记为public
的方法通常会被代码分析器与标记为internal
的同名方法有所不同。举个例子,对于一个public
方法,分析器可能会警告需要检查该方法的参数不是null值。而对于internal
方法,分析器可能会配置为对null
检查更加宽松。或者分析器可能通过对程序集所有源文件进行流分析,确定永远不会将null
作为参数传递给特定的方法,并因此确定无需检查参数是否为null
。还有许多其他分析器对public
和internal
方法处理不同的例子。internal
的属性在WPF中用于数据绑定时会抛出BindingExpression path error
。因此,这些属性必须是public
才能正常工作,即使数据绑定发生在同一程序集中。public interface IAccount{
int TotalAmount(long accountID);
}
internal class Account:IAccount{
public int TotalAmount(long accountID){
...
}
}
public class Customer{
public long accountID {get;set;}
public int GetTotalAmount(){
IAccount account = new Account();
return account.TotalAmount(accountID)
}
}
如果您正在引用 AccountService.csproj 到 BankService.csproj (BankService.csproj --> AccountService.csproj)
Below are the properties that accessible in BankService.csProj
Customer.GetTotalAmount() -- Accessible
IAccount.TotalAmount() -- Accessible
Account.TotalAmount() -- Not Accessible (as account class is internal)
internal
和所有方法public
。如果需要更高的可见性,可以再次将整个类设置为public
。但我不确定它是否应该以这种方式使用。所以我继续谷歌搜索... 编辑 Et voilà,同样的主题:https://dev59.com/xGox5IYBdhLWcg3wSCfk - ecth