改善C程序的50種方法(第二版).docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
改善C程序的50種方法(第二版)

C#高效编程改善C#程序的50种方法(第2版)读书笔记第一部分:C#的语言元素  一、用属性代替可访问的字段  1、.NET数据绑定只支持对属性的数据绑定,而不支持公有数据成员;  2、在属性的get和set访问器中可使用lock添加多线程的支持。  二、用readonly(运行时常量)而不是const(编译时常量)  1、const只可用于基元类型、枚举、字符串,而readonly则可以是任何的类型;  2、const在编译时将替换成具体的常量,这样如果在引用中同时使用了const和readonly两种值,则对readonly的再次改变将会改变设计的初衷,这是需要重新编译所更改的程序集,以重新引用新的常量值。  3、const(属于编译时常量)比readonly(运行时)效率高,但失去了应用的灵活性。  三、用is与as操作符而不是强制类型转换  1、两者都是在运行时进行类型的转换,as操作符只能使用在引用类型,而is可以使用值和引用类型;  2、通常的做法是用is判断类型,然后选择使用as或强类型转换操作符(用operater定义的转换)有选择地进行。  四、ConditionalAttribute代替#if #endif条件编译  1、ConditionalAttribute只用于方法级,对其他的如类型、属性等的添加都是无效的;而#if #endif则不受此限制;Conditional 特性强制我们将条件代码拆分为若干独立的方法,有助于我们代码的高效性。语法:[Conditional(“DEBUG”)]。  2、ConditionalAttribute可以添加多个编译条件的或(OR)操作,例如:[Conditional(“DEBUG”),Conditional(“TRACE”)],而#if #endif则可以添加与(AND),若想创建一个依赖多个环境变量的条件例程,我们必须使用#if时,应该避免将可执行代码放入其中,即#if只不是创建新的符号而已;  3、ConditioanlAttribute定义可以放在一个单独的方法中,使得程序更为灵活。#if和#endif会在Release和Debug版本中都留下一个方法,虽然在Release中什么也不做,但是方法加载、JIT编译还是会有一些开销。且易引发一些意想不到的Bug。  五、为类型提供ToString()方法  1、可以通过重写以更友好的方式提供用户需要的信息,让类型的ToString()方法输出有用的信息;【C#3.0中编译器会为所有匿名类型创建一个默认的ToString()方法,将显示对象中的每个属性值。】2、使用IFormatter.ToString()方法提供更灵活的定制,如果添加IFormatProvider 和ICustomFormatter接口则更有意义的定制消息输出。  六、理解几个等同性判断间的关系1、当我们创建类型时,应该为类型定义“等同性”含义。C#提供4种不同的函数来判断两个对象的是否“相等”,ReferenceEquals(Object left , object right)、Equals(object left , object right)、virtual Equals(object right)、Operator==(MyClass left , MyClass right)。2、对于前两个我们永远不需要重新定义,ReferenceEquals()方法判断依据是对象的标识,无论对象是引用还是值类型(意味着两个相同值的值类类比较永远是False);静态Equals()方法实质是调用了Left参数的Equals()方法来判断两个对象是否相等。  3、可重写的Equals()方法默认使用对象标识判断,即比较对象是否引用相等,但对于值类型准备准备效率不高,所以建议在创建值类型时,都覆写其ValueType.Equals()方法,而对于引用类型只当需要改变其预定义语义时才重写。例如字符串需要使用值语义而不是引用语义来判断是否相等。4、当覆写Equals()方法时,也要同时实现IEquatableT,也应当重写GetHashCode()方法,同时提供operater==()操作。  七、理解GetHashCode()的陷阱1、GetHashCode()仅在一种地方用到,即基于散列的集合定义键的散列值时,包括HashSetT和DictionaryK,V容器等。Object提供的GetHashCode()效率低下,创建大多数类型,最好的的办法是完全避免实现GetHashCode();2、如果创建的类型将被当做散列表中的键来使用,则需要自己实现GetHashCode()。3、重写GetHashCode()必须遵循以下3个原则:(1)如果两个对象相

文档评论(0)

sfkl + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档