C# 2.0 之 static class[2]

原创 2004年05月12日 18:29:00

看看什么是 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 中很容易有两个类型死锁的情况发生,在编写代码的时候一定要想清楚。

扯远了。

刘敏(Rustle Liu)http://ms.mblogger.cn/rustle/

C# 静态类(static class)等笔记

转载:http://blog.csdn.net/xiaobai1593/article/details/7278014 类可以声明为 static 的,以指示它仅包含静态成员。 静态类在加载包含该...
  • u012252959
  • u012252959
  • 2015年09月07日 10:57
  • 1546

Swift_关键字static和class的区别

说明: class 关键字有两个作用: 自定义类和重写. 本文只讲重写作用. 此文章由 @春雨 编写. 经 @Scott 审核. 若转载此文章,请注明出处和作者 代码 import ...
  • Sponge_CMZ
  • Sponge_CMZ
  • 2016年05月05日 12:54
  • 5725

java中static修饰class说明

一般情况下static是不能修饰class的,
  • managermeng
  • managermeng
  • 2014年09月09日 10:00
  • 2176

C++:关于class member声明为static的情况

2014.5.27 reference: C++ primer 5th, $7.6:Static Class Members TOPIC 1:一个类中的member(data member和funct...
  • tong_xin2010
  • tong_xin2010
  • 2014年05月27日 15:52
  • 845

【java面试题】Static Nested Class(嵌套类) 和 Inner Class(内部类)的不同 、final、static

nested class(一般是c++的说法),Inner class(一般是java的说法)。JAVA内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。 具体可见http://java....
  • Angiexia
  • Angiexia
  • 2014年03月04日 14:25
  • 2646

AsyncTask我来给你扯会蛋

AsyncTask我们平时用的再熟悉不过了,让我们说的话,它是一个什么东东?我个人的理解是它是一个Thread+handler来实现的一个简单的更新UI的这个一个东西,不过这中说话应该不会让人信服。接...
  • ly985557461
  • ly985557461
  • 2015年08月05日 12:47
  • 985

unity 3d中如何创建公有共用的代码段或数据,让所有其他类或者脚本都能访问?(代码说明static 静态类的使用)

大家在做游戏的过程中可能都会遇到这样的情况:很多类,很多物体,都需要使用同一个方法来实现相同功能,就像c#或其他编程语言中的静态类那样使用。那么unity 3d有没有这样的功能呢?答案是当然有了。 ...
  • sinat_23079759
  • sinat_23079759
  • 2016年10月31日 19:58
  • 1428

静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同

答:Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化,其语法看起来挺诡异的,如下所示。 ...
  • zzy7075
  • zzy7075
  • 2015年12月22日 10:53
  • 3056

C#-sealed 封装类的使用

示例1 : using System; using System.Collections.Generic; using System.Linq; using System.Text; namesp...
  • makenothing
  • makenothing
  • 2014年04月10日 21:22
  • 1315

Fragment在生命周期中是如何走到onCreateView的(一)

最近遇到了一个Crash,于是想探究一下Fragment在onCreateView之前都干了什么?生命周期是如何跟Activity同步的?Fragment的视图又是如何添加到布局中的? 一步一步来探...
  • jiansheliuxing
  • jiansheliuxing
  • 2017年01月08日 22:30
  • 1180
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C# 2.0 之 static class[2]
举报原因:
原因补充:

(最多只允许输入30个字)