你能解释一下c#中internal关键字的实际用法吗?
我知道内部修饰符限制了对当前程序集的访问,但何时以及在何种情况下应该使用它?
你能解释一下c#中internal关键字的实际用法吗?
我知道内部修饰符限制了对当前程序集的访问,但何时以及在何种情况下应该使用它?
当前回答
在某些情况下,将类的成员设为内部是有意义的。例如,如果你想控制类的实例化方式;假设您为创建类的实例提供了某种类型的工厂。您可以将构造函数设置为内部的,这样工厂(位于同一个程序集中)就可以创建类的实例,但程序集中之外的代码不能。
然而,如果没有特定的原因,我不认为将类或成员设置为内部的有任何意义,就像没有特定的原因将它们设置为公共的或私有的一样没有意义。
其他回答
当您有方法、类等需要在当前程序集范围内访问,而不能在当前程序集范围外访问时。
例如,一个DAL可能有一个ORM,但对象不应该暴露给业务层,所有交互都应该通过静态方法完成,并传递所需的参数。
您希望从同一程序集中的许多其他类中访问,但希望确保其他程序集中的代码不能访问的实用程序或帮助程序类/方法。
来自MSDN(通过archive.org):
内部访问的一个常见用途是在基于组件的开发中,因为它允许一组组件以私有的方式进行合作,而不会向其余应用程序代码公开。例如,用于构建图形用户界面的框架可以提供Control和Form类,它们使用具有内部访问权限的成员进行合作。因为这些成员是内部的,所以它们不会暴露给使用框架的代码。
还可以使用内部修饰符和InternalsVisibleTo程序集级别属性来创建“友程序集”,这些程序集被授予对目标程序集内部类的特殊访问权。
这对于创建单元测试程序集非常有用,然后允许这些程序集调用要测试的程序集的内部成员。当然,没有其他程序集被授予这种级别的访问权限,所以当您发布系统时,将维护封装。
前几天,也许是一个星期,在一个我不记得的博客上看到了一个有趣的东西。基本上这不是我的功劳,但我认为它可能有一些有用的应用。
假设您想让另一个程序集看到一个抽象类,但不希望有人能够继承它。Sealed不能工作,因为它是抽象的,这个程序集中的其他类确实从它继承。Private将不起作用,因为您可能希望在另一个程序集中声明一个Parent类。
namespace Base.Assembly { public abstract class Parent { internal abstract void SomeMethod(); } //This works just fine since it's in the same assembly. public class ChildWithin : Parent { internal override void SomeMethod() { } } } namespace Another.Assembly { //Kaboom, because you can't override an internal method public class ChildOutside : Parent { } public class Test { //Just fine private Parent _parent; public Test() { //Still fine _parent = new ChildWithin(); } } }
如您所见,它有效地允许某人使用父类而不能够继承。
在某些情况下,将类的成员设为内部是有意义的。例如,如果你想控制类的实例化方式;假设您为创建类的实例提供了某种类型的工厂。您可以将构造函数设置为内部的,这样工厂(位于同一个程序集中)就可以创建类的实例,但程序集中之外的代码不能。
然而,如果没有特定的原因,我不认为将类或成员设置为内部的有任何意义,就像没有特定的原因将它们设置为公共的或私有的一样没有意义。
如果Bob需要BigImportantClass,那么Bob需要让拥有项目A的人注册,以保证BigImportantClass将被编写以满足他的需求,测试以确保它满足他的需求,被记录为满足他的需求,并且将设置一个过程以确保它永远不会被更改,从而不再满足他的需求。
如果一个类是内部的,那么它就不需要经过这个过程,这为项目a节省了预算,他们可以把这些钱花在其他事情上。
内在的意义并不在于它让鲍勃的生活变得困难。而是它允许您控制Project A在特性、生命周期、兼容性等方面做出的昂贵承诺。