你能解释一下c#中internal关键字的实际用法吗?

我知道内部修饰符限制了对当前程序集的访问,但何时以及在何种情况下应该使用它?


当前回答

您希望从同一程序集中的许多其他类中访问,但希望确保其他程序集中的代码不能访问的实用程序或帮助程序类/方法。

来自MSDN(通过archive.org):

内部访问的一个常见用途是在基于组件的开发中,因为它允许一组组件以私有的方式进行合作,而不会向其余应用程序代码公开。例如,用于构建图形用户界面的框架可以提供Control和Form类,它们使用具有内部访问权限的成员进行合作。因为这些成员是内部的,所以它们不会暴露给使用框架的代码。

还可以使用内部修饰符和InternalsVisibleTo程序集级别属性来创建“友程序集”,这些程序集被授予对目标程序集内部类的特殊访问权。

这对于创建单元测试程序集非常有用,然后允许这些程序集调用要测试的程序集的内部成员。当然,没有其他程序集被授予这种级别的访问权限,所以当您发布系统时,将维护封装。

其他回答

在“使用尽可能严格的修饰符”规则的驱动下,我在需要访问的任何地方都使用internal,比如,从另一个类中访问方法,直到我显式地需要从另一个程序集访问它。

由于程序集接口通常比类接口的总和更窄,所以我在很多地方使用它。

前几天,也许是一个星期,在一个我不记得的博客上看到了一个有趣的东西。基本上这不是我的功劳,但我认为它可能有一些有用的应用。

假设您想让另一个程序集看到一个抽象类,但不希望有人能够继承它。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();
    }
  }
}

如您所见,它有效地允许某人使用父类而不能够继承。

使用internal的另一个原因是混淆了二进制文件。混淆器知道打乱任何内部类的类名是安全的,而公共类的名称不能打乱,因为这可能破坏现有的引用。

internal关键字的一个用途是限制程序集用户对具体实现的访问。

如果您有一个工厂或其他用于构造对象的中心位置,则程序集的用户只需处理公共接口或抽象基类。

此外,内部构造函数允许您控制实例化公共类的位置和时间。

如果Bob需要BigImportantClass,那么Bob需要让拥有项目A的人注册,以保证BigImportantClass将被编写以满足他的需求,测试以确保它满足他的需求,被记录为满足他的需求,并且将设置一个过程以确保它永远不会被更改,从而不再满足他的需求。

如果一个类是内部的,那么它就不需要经过这个过程,这为项目a节省了预算,他们可以把这些钱花在其他事情上。

内在的意义并不在于它让鲍勃的生活变得困难。而是它允许您控制Project A在特性、生命周期、兼容性等方面做出的昂贵承诺。