首页 > 开发 > 综合 > 正文

C# 2.0 之 static class[2]

2024-07-21 02:24:45
字体:
来源:转载
供稿:网友
看看什么是 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 中很容易有两个类型死锁的情况发生,在编写代码的时候一定要想清楚。



收集最实用的网页特效代码!

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表