A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

我猜静态类应该是在程序结束时销毁吧,要拿证据出来说话呀,猜是没用的。求提升测试能力!

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

4 个回复

倒序浏览
主程序进程开始时创建,主进程结束销毁  {:soso_e113:} 猜得
回复 使用道具 举报
静态成员在编译时已经分配内存了。
静态类仅能包含静态成员,而且静态类不包含实例构造函数(也即不能被实例化),也无从销毁(析构函数),无需创建类的实例,也即你在不通知程序(不创建该类的实例)的前提下,在程序的任意位置就能调用该类的成员,所以我想只要程序不关闭,此类就会一直存在下去。
比如说system.Console.WriteLine();方法,静态类System.Math你就可以不new而到处用。
鄙人愚见,不知楼主意下如何?
好了,扯淡之后是微软MSDN的官方解释:
和所有类类型一样,当加载引用静态类的程序时,.NET Framework 公共语言运行时 (CLR) 将加载该静态类的类型信息。程序不能指定加载静态类的确切时间。但是,可以保证在程序中首次引用该类前加载该类,并初始化该类的字段并调用其静态构造函数。静态构造函数仅调用一次,在程序驻留的应用程序域的生存期内,静态类一直保留在内存中。
MSDN_C#静态类和静态成员(http://msdn.microsoft.com/zh-cn/library/79b3xss3.aspx)

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
有来有趣 发表于 2012-10-20 01:01
静态成员在编译时已经分配内存了。
静态类仅能包含静态成员,而且静态类不包含实例构造函数(也即不能被实 ...

MSDN的解释肯定是权威的,但是我想知道怎么去测试它。比如装箱和拆箱可以用IL反编译直观的看出来,这里引用一下我对静态类的理解和为什么想要得知静态类在什么时候销毁。
什么时候用静态类,什么时候用非静态类,有什么区别意义?
我的理解:
静态类:当系统中有公共类的时候,可以把这个公共类声明为静态类,静态类成员直接用类调用,在调用时执行静态构造函数,此时得到一个实例。我猜静态类应该是在程序结束后销毁吧(明天看怎么测试下),如果正如我猜想的那样,那么好处就是这个程序从始至终都只有一个实例。
非静态类:当系统中需要用到该类的多个实例时,就使用非静态类。好处是多个实例之间互不影响。
从字面意义的理解,静态:静止的状态,不会产生变化,所以只有一个实例。非静态(又称实体类):非静止的状态,会产生变化,所以可能会有多个实例。
回复 使用道具 举报
本帖最后由 有来有趣 于 2012-10-20 22:23 编辑
♂张耕明 发表于 2012-10-20 10:21
MSDN的解释肯定是权威的,但是我想知道怎么去测试它。比如装箱和拆箱可以用IL反编译直观的看出来,这里引 ...

把静态类当做全局变量和全局函数的整合对象来用。
一个来源于百度的例子,从优化内存的角度来考虑,比如数据库连接字段就可以定义在静态类中,使用时可以直接调用,而不需要一次次的实例化去占内存。
非静态类就比较普遍,比如你只在程序的某处才需要调用它,关乎特定的对象,而且并不频繁,那一般都是用非静态的了。

呃,至于如何完整的测试和验证,我只能从理论上推测,具体直观的监视该类在内存中存在我不知道……
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马