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

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


当前回答

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

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

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

其他回答

请记住,当有人查看您的项目名称空间时,任何定义为public的类都会自动显示在智能感知中。从API的角度来看,只向项目的用户展示他们可以使用的类是很重要的。使用internal关键字隐藏他们不应该看到的东西。

如果项目A的Big_Important_Class打算在项目外部使用,那么不应该将其标记为内部。

然而,在许多项目中,经常会有一些实际上只打算在项目中使用的类。例如,您可能拥有一个类,该类保存参数化线程调用的参数。在这些情况下,您应该将它们标记为内部的,如果没有其他原因,只是为了保护自己不受意外的API更改的影响。

当你的类或方法不完全符合面向对象范式,它们做危险的事情,需要从你控制下的其他类和方法调用,而你不想让其他人使用它们时。

public class DangerousClass {
    public void SafeMethod() { }
    internal void UpdateGlobalStateInSomeBizarreWay() { }
}

我发现内部被过度使用了。您真的不应该只向某些类公开某些功能,而不向其他使用者公开。

在我看来,这打破了界面,打破了抽象。这并不是说永远不应该使用它,而是更好的解决方案是重构到不同的类,或者在可能的情况下以不同的方式使用。然而,这并不总是可能的。

The reasons it can cause issues is that another developer may be charged with building another class in the same assembly that yours is. Having internals lessens the clarity of the abstraction, and can cause problems if being misused. It would be the same issue as if you made it public. The other class that is being built by the other developer is still a consumer, just like any external class. Class abstraction and encapsulation isnt just for protection for/from external classes, but for any and all classes.

另一个问题是,许多开发人员会认为他们可能需要在程序集中的其他地方使用它,并将其标记为内部,即使他们当时并不需要它。另一个开发商可能会认为它就在那里。通常,在有明确的需要之前,您希望将其标记为私有。

但其中有些可能是主观的,我并不是说永远不应该使用它。只在需要的时候使用。

在某些情况下,将类的成员设为内部是有意义的。例如,如果你想控制类的实例化方式;假设您为创建类的实例提供了某种类型的工厂。您可以将构造函数设置为内部的,这样工厂(位于同一个程序集中)就可以创建类的实例,但程序集中之外的代码不能。

然而,如果没有特定的原因,我不认为将类或成员设置为内部的有任何意义,就像没有特定的原因将它们设置为公共的或私有的一样没有意义。

唯一一件事我曾经使用内部关键字是许可证检查代码在我的产品;-)