什么是C#的内部密封类?

Byr*_*ock 64 c# sealed

我正在查看一些C#代码,以扩展VS2010中的语言支持(Ook示例).我看到一些叫做的课程internal sealed class

这些怎么办?会用它们吗?

谢谢

Tim*_*oyd 140

这是一个类:

  • internal:只能从定义的程序集(或朋友程序集)中访问.
  • sealed:不能继承.

将类标记为internal阻止程序集的外部用户使用它们的方法.它实际上是一种设计封装形式,恕我直言,标记不属于预期的公共API \对象模型的类型是一种很好的做法internal.从长远来看,这可以防止库的用户将自己耦合到您不想要的类型.这种无意识的耦合会损害您更改和改进库实现方式的能力,因为您无法在不破坏客户端的情况下更改它们.使用internal有助于将库的公共和可用表面区域保持在预期的范围内.

将类标记为sealed阻止继承这些类.这是一个相当激烈的设计意图,如果一个类已经如此专业化以至于通过继承直接或通过覆盖其行为而不应该向其添加其他功能是明智的,这有时是有用的.

internalsealed以完全不同的方式修改类型,但它们可以一起使用.

注意您可以进一步确定范围,internal因为您可以将一组其他程序集定义为"朋友".这些朋友程序集可以访问您的internal类型.这对于定义协作组件集(例如生产和测试组件)非常有用.通常希望测试组件可以看到它正在测试的组件中的所有类型.

  • 有些人认为密封不是真正的"激烈",应该被视为默认......我见过Eric Lippert和Jon Skeet谈论这个问题. (7认同)
  • @Casey,我完全可以看到你的一面,并从中受益。但是,如果我不想允许继承,将InitializeObject设置为密封是不是更好? (2认同)

HyL*_*ian 16


HAB*_*JAN 11

内部表示该成员可供同一程序集中定义的其他类型访问.密封类是抽象的对立面.它可以实例化,但不能作为基类.密封课程的主要原因是防止用户摆弄它并打破它.密封类也允许某些编译器优化,而非密封类是不可能的.


Pow*_*ord 5

一个internal sealed类是:

internal- 只能从同一个程序集中访问
sealed- 不能是子类

换句话说,你无法直接使用它.