注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

信息 灵感 创新

I? =Information,Inspiration,Innovation

 
 
 

日志

 
 
关于我

we are 5. Mathematics, Computation, Programming, Engineering, and Making fun of life.

网易考拉推荐

C#精髓摘要(9)  

2011-07-24 14:49:20|  分类: C# & .NET |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

接前一部分,地址在

这里

C#精髓》一书属于O'Reilly出版的动物系列技术书籍,这一系列的书算是赫赫有名了,趁现在有空,走马观花地读一下这本书。

C精髓摘要(2) - Castor - 趁年轻,多折腾~~
封面上的动物是星鼻鼹鼠(Condylura cristata)。与所有鼹鼠一样,星鼻鼹鼠主要居住在自己挖的地下隧道中,觅食时才出来。鼹鼠的身体上布满了防水的灰色短毛,大约6~8英寸长。它们的显著特征是长长的爪子,用于挖掘和觅食都非常理想。它们的眼睛、耳朵很小,牙齿非常锐利。视力和听觉很差。

星鼻鼹鼠的名字来源于它们鼻子上的25个触须,触须可以帮助鼹鼠找到食物,主要是昆虫、蠕虫、小鱼和其他小的池塘生物。星鼻鼹鼠是鼹鼠家族中的游泳健将,可以潜入水中捕鱼。它们喜欢住在沼泽中,分布于美国东北部和加拿大东南部。
星鼻鼹鼠是哺乳动物,雌鼹鼠每年可以生3~6只幼崽。
星鼻鼹鼠对人类的危害比其他鼹鼠要小,因为它偏爱水生食物,很少到人类的后院活动。
===================================================================================================

定制属性信息

使用定制属性来扩展元数据,用保存与元素相关的元数据中的附加信息修饰代码元素。附加信息可在运行时获取。可以将其看作是扩展了C#内置声明结构集合,如publicprivatesealed等。

预定义属性信息

三个通用属性信息:AttributeUsageConditionalObsolete

AttributeUsage属性信息用于控制编译器如何处理新属性信息(新属性被指定为何种目标)。

Conditional属性信息用于返回类型为void的任何方法,告诉编译器有条件地忽略方法调用,除非在调用代码中定义了某个符号。

Obsolete属性信息用于所有合法属性学习目标,表示该目标是过时的。

CLSCompliant属性信息用于配件时,告诉编译器是否验证配件中的所有导出类型的CLS兼容性。用于其他属性目标时,允许目标声明自身是否是CLS兼容的。

Serializable属性信息将类、结构、枚举或者委托,将其标记为可序列化的。

NonSerializable属性信息用于字段,防止其与所包含的类或者结果一起序列化。

定义新的定制属性信息

1.先由System.Attribute类派生出一个新类,并以Attribute结尾(虽然不是必须的)。

2.用公共构造函数提供类。

3.声明公共实例字段,或公共实例读写属性。

4.定义属性信息。

运行时获取定制属性

使用Type实例的GetCustomAttribute方法。SerializableNonSerializable不能通过反射访问,而Obsolete却可以,因为前面两个是伪定制属性信息。

自动内存管理

现代编程语言使用两种特殊的结构分配内存:堆栈(Stack)和堆(Heap)。

堆栈分配由操作系统自动管理,堆的管理因语言而异,CC++是手动管理,而JavaC#中是自动管理的。

悬挂指针:对象删除之后又使用他们

内存泄漏:对象没用时忘记删除指针

无用资源回收器(Garbage Collector

它不干涉对象的访问,只是间歇地启动并跟踪存于堆中的对象的映射,从而确定那些是无用资源,可以回收。GC从根对象的引用集合开始,遍历对象映像,将碰到的对象标记为可到达的,过程结束后,未标记的对象就认为是无用的,将被丢弃,然后释放内存。有用对象被移到堆底,释放足够空间。

GC将受管制的堆分为三代,刚分配的是Gen0代,已经经历过一次回收循环而存在的对象处于Gen1代,其他处于Gen2代。

终结器(Finalizer

它是在对象被定为无用资源时,由GC异步调用的方法。

有终接器的对象在收集时会产生较大的开销。

有终结器的对象比没有终结器的对象在受管制堆中分配所花的时间较长。

有终结器的对象在调用其他对象(即使没有终结器),会不必要地拉长被引用对象的生存期。

不可能预测一组对象终结器的调用顺序。

终结器总结:有些情况下确实需要,但通常你并不想用,除非不可避免。

Dispose方法和Close方法

Microsoft推荐写上述两个方法来执行所需的清除工作。如果还有一个Finalize方法,还要对System.GC类型调用静态的SuppressFinalize方法,表示Finalize方法不在被调用。如下:

public void Dispose()

{

    ...

    GC.SuppressFinalize(this);

}

  评论这张
 
阅读(787)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016