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

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


当前回答

当您有方法、类等需要在当前程序集范围内访问,而不能在当前程序集范围外访问时。

例如,一个DAL可能有一个ORM,但对象不应该暴露给业务层,所有交互都应该通过静态方法完成,并传递所需的参数。

其他回答

根据经验,有两种成员:

公共表面:从外部组件可见(公共的、受保护的和内部受保护的): 调用者不受信任,因此需要参数验证、方法文档等。 私有表面:从外部程序集(私有和内部或内部类)中不可见: 调用者通常是可信的,所以参数验证、方法文档等可以省略。

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

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

我有一个项目,使用LINQ-to-SQL的数据后端。我有两个主要的名称空间:Biz和Data。LINQ数据模型存在于数据中,并标记为“内部”;Biz命名空间拥有围绕LINQ数据类的公共类。

这就是数据。Client和business .Client;后者公开了数据对象的所有相关属性,例如:

private Data.Client _client;
public int Id { get { return _client.Id; } set { _client.Id = value; } }

Biz对象有一个私有构造函数(强制使用工厂方法)和一个内部构造函数,看起来像这样:

internal Client(Data.Client client) {
    this._client = client;
}

库中的任何业务类都可以使用它,但是前端(UI)无法直接访问数据模型,从而确保业务层始终充当中介。

这是我第一次真正使用内部,它被证明是非常有用的。

当您有方法、类等需要在当前程序集范围内访问,而不能在当前程序集范围外访问时。

例如,一个DAL可能有一个ORM,但对象不应该暴露给业务层,所有交互都应该通过静态方法完成,并传递所需的参数。

这个怎么样:通常建议不要向程序集的外部用户公开List对象,而是公开IEnumerable对象。但是在程序集中使用List对象要容易得多,因为您可以获得数组语法和所有其他List方法。因此,我通常有一个内部属性,公开要在程序集中使用的List。

欢迎对这种方法提出意见。