当前位置:首页 > 网络编程 > WEB编程 > ASP.net > C# 2.0 之 static class[2]

C# 2.0 之 static class[2]

点击次数:28 次 发布日期:2008-11-27 00:42:07 作者:源代码网
源代码网推荐 看看什么是 static class 吧,很久以前我就为不能声明一个 abstract sealed class 而苦恼不已,我在 CSDN 上曾经提出过这个问题,可是并没有获得共鸣。我得到的回复是这样的:

abstract 和 sealed一起用?定义abstract的目的就是抽象基类,seal表示不能继承的实体类,完全是两回事,怎么可能一起用呢?
abstract表明必须要被继承,sealed表明不可以被继承,这两个是矛盾的,怎么可以一起用呢。

通过查看 IL 代码,我们会发现 static class 实际上就是 abstract sealed class,只不过编译器在编译时顺便对 static class 的成员修饰符进行检查而已。

让我们再来猜测一下 MS 开发人员的想法:他们的目的是想获得 abstract sealed class 的效果,但却为语义上的矛盾而苦恼不已,大家想获得一个优美的解决方式,于是就为 C# 2.0 新增了一个 static 关键字,完美的解决了这个问题。

也许有人会问:为什么不是 static class = abstract class + static member limit 而要加上 sealed 的限制呢?理由是继承一个只有 static 成员的类和重新写一个类完全没有区别。为什么这么说呢?因为 static 必然是not virtual,继承它又能有什么用呢?

static class 还有一个限制,那就是只能从 System.Object 继承,为什么会有这个限制,理由和上面差不多。

每每提到 static 关键字,我就想起了 static constructor,感谢 MS 的开发人员提供了这么好的一个特性。但是 C# 提供了 static constructor 却没有提供 static destructor,不过在 Applied Microsoft .NET Framework Programming 一书中 Jeffery Richter 给我们提供了一个办法就是通过 System.AppDomain.DomainUnload 事件去达到同样的效果。

使用 static constructor 要注意的就是这里抛出任何异常都会导致该类型在重新加载 AppDoamin 之前不再可用,所以要加倍小心,另外 static contructor 中很容易有两个类型死锁的情况发生,在编写代码的时候一定要想清楚。



源代码网供稿.
网友评论 (0)
会员中心
网络编程
本站推荐
网络编程之精华