你能解释一下c#中internal关键字的实际用法吗?
我知道内部修饰符限制了对当前程序集的访问,但何时以及在何种情况下应该使用它?
你能解释一下c#中internal关键字的实际用法吗?
我知道内部修饰符限制了对当前程序集的访问,但何时以及在何种情况下应该使用它?
当前回答
internal的一个非常有趣的用法(internal member当然仅限于声明它的程序集)是在某种程度上从它获得“好友”功能。友成员是仅对声明它的程序集之外的某些其他程序集可见的对象。c#没有内置对friend的支持,但是CLR有。
可以使用InternalsVisibleToAttribute来声明友程序集,并且来自友程序集中的所有引用将在友程序集中的范围内将声明的程序集的内部成员视为公共成员。这样做的一个问题是所有内部成员都是可见的;你不能挑三拣四。
InternalsVisibleTo的一个很好的用途是将各种内部成员暴露给单元测试程序集,从而消除了测试这些成员所需的复杂反射工作。所有内部成员都可见并不是什么大问题,但是采用这种方法确实会严重破坏类接口,并且可能会破坏声明程序集中的封装。
其他回答
当你的类或方法不完全符合面向对象范式,它们做危险的事情,需要从你控制下的其他类和方法调用,而你不想让其他人使用它们时。
public class DangerousClass {
public void SafeMethod() { }
internal void UpdateGlobalStateInSomeBizarreWay() { }
}
其思想是,当您设计一个库时,只有打算从外部(由库的客户端)使用的类应该是公共的。这样你就可以隐藏
可能在未来的版本中更改(如果它们是公开的,您将破坏客户端代码) 对客户是无用的,可能会造成混乱 不安全(所以使用不当会严重破坏你的库)
etc.
如果你在开发内部解决方案,那么使用内部元素就不是那么重要了,因为通常客户会经常与你联系,并且/或访问代码。不过,它们对库开发人员来说相当重要。
如果您正在编写一个DLL,它将大量复杂的功能封装到一个简单的公共API中,那么“internal”将用于不公开的类成员。
隐藏复杂性(又称封装)是高质量软件工程的主要概念。
在“使用尽可能严格的修饰符”规则的驱动下,我在需要访问的任何地方都使用internal,比如,从另一个类中访问方法,直到我显式地需要从另一个程序集访问它。
由于程序集接口通常比类接口的总和更窄,所以我在很多地方使用它。
唯一一件事我曾经使用内部关键字是许可证检查代码在我的产品;-)