1:用属性来访问类的私有成员
   Always use properties instead of accessible data members.

2:为常量优先选择readonly而不是const。
   Prefer readonly to const.
   const常量仅限于几个基本类型,编译时绑定;readonly常量在运行时绑定。

3:优先选择is或者as操作符而不是做强制类型转换.
   Prefer the is or as operators to casts.

4:使用Conditional属性来代替IF/ENDIF程序块。
   Use Conditional Attributes Instead of #if。

5: 始终提供一个有意义的ToString函数.
   Always Provide ToString().
   默认继承object的方法ToString()返回的结果是GetType()后转换成String.
  
6:区别值类型数据和引用类型数据.
   Distinguish Between Value Types and Reference Types.
   把底层面的数据用值类型来处理,而包含复杂操作,需要进行扩展的数据用引用类型来处理。
      
7: 将值类型尽可能实现为具有常量性和原子性的类型.
   Prefer Immutable Atomic Value Types.
   两种方法:1.所有成员加上readonly标示,只在构造函数中被修改;2.删除属性set部分。
   在实现不可变的原子值类型(若其中包括引用类型分支)时,在进行成员赋值时,防止浅copy。

8: 确保0为值类型的有效状态.
   Ensure That 0 Is a Valid State for Value Types
   数值类型的默认值为0,但0在enum中可能无意义。

9: 理解4个相等判断之间的关系.
   Understand the Relationships Among ReferenceEquals(),static Equals(),instance Equals() and operator==.
   ReferenceEquals():判断两个引用类型对象是否指向同一个地址;
   static Equals()  :把比较的职责委交给了一个正在比较的类型(第一个参数的类型);
   instance Equals():类型重载函数。不要在值类型中重载此运算符(boxing开销);
   operator==       :类型重载函数。不要在引用类型中重载此运算符;

10:理解GetHashCode()方法的缺陷.
   Understand the Pitfalls of GetHashCode().
   GetHashCode()的目的是产生一个Key,为了方便在HashTable或者Dictionary中的检索。引用类型的GetHashCode()其实就是返回当前引用标记(一般都是正确的,不必override);值类型自带的GetHashCode()是以其第一个成员的GetHashCode值作为其的返回值(一般都是不正确的)。
   不建议使用值类型对象的GetHashCode函数返回值来作为HashTable对象的Key;
   引用类型是可以使用的,但是要注意如果重写了Equals函数,一定要重写GetHashCode函数来达到一致;
   重写此函数时注意:
      1.不管是值类型还是引用类型,要保证产生HashCode的成员不能被修改;
      2. 对于产生HashCode的成员修改,要以产生新对象进行处理,同时要在使用端作相应的修改,即先删除旧的在添加新的。

11:优先采用foreach循环语句.
   Prefer foreach Loops.
   foreach能为迭代非0下限的数组、多维数组生成正确的代码。但foreach有两个限制:1.不能修改枚举成员;2.不要对集合进行删除操作。

转载于:https://www.cnblogs.com/happyhippy/archive/2007/03/15/675929.html

Effective C# 摘录(1) - C# Language Elements相关推荐

  1. Effective C# 摘录(3) - 使用C#表达设计

    19:定义并实现接口优于继承类型.    Prefer Defining and Implementing Interfaces to Inheritance.    接口支持多重继承,可以作用于值类 ...

  2. BERT论文阅读(一): Pre-training of Deep Bidirectional Transformers for Language Understanding

    BERT三大核心: pre-training bidirectional==>alleviates the unidirectionality constriant of fine-tuning ...

  3. Paper:《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding用于语言理解的深度双向Tr

    Paper:<BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding用于语言理解的深度双 ...

  4. Paper:GPT之《Improving Language Understanding by Generative Pre-Training》翻译与解读

    Paper:GPT之<Improving Language Understanding by Generative Pre-Training>翻译与解读 目录 GPT之<Improv ...

  5. 《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》论文翻译--中英对照

    文章目录 1 Introduction(简介) 2 Related Work(相关工作) 2.1 Feature-based Approaches(基于特征的方法) 2.2 Fine-tuning A ...

  6. Interview QA-COBOL COBOL II

    Q1) Name the divisions in a COBOL program ?. A1) IDENTIFICATION DIVISION, ENVIRONMENT DIVISION, DATA ...

  7. CheckStyle:Checks之标准Checks

    标准Checks 标准Checkstyle Checks适用于常规Java编码样式,并且不需要外部库. Checkstyle提供了许多可应用于源代码的检查.以下是按字母顺序排列的参考. Checker ...

  8. 如何写出一份真正让您受聘的出色简历

    This is a data-driven guide to writing a resume that actually gets you hired. I've spent the past fo ...

  9. Go函数及与函数相关机制 【Go语言圣经笔记】

    函数 函数可以让我们将一个语句序列打包为一个单元,然后可以从程序中其它地方多次调用.函数的机制可以让我们将一个大的工作分解为小的任务,这样的小任务可以让不同程序员在不同时间.不同地方独立完成.一个函数 ...

最新文章

  1. Recipe 1.6. Converting Between Characters and Values
  2. 商城网站前期功能设置这几项绝不能少!
  3. 专家提醒:计算机专业毕业生求职三要点!
  4. Caffe学习系列(16):各层权值参数可视化
  5. 到底什么是hash partition?
  6. WINCE字体动态加载
  7. 【HDU - 1599】find the mincost route (Floyd最小环,最短路问题)
  8. QT每日一练day14:QFontDialog字体对话框
  9. win7下的ipython没有的问题
  10. Node.js编写CLI的实践
  11. 编写GOM引擎登录器,直接启动GOM客户端DAT文件不掉线
  12. 凭什么?80后合伙人“叫板Excel”
  13. 加利福尼亚大学圣地亚哥分校计算机科学专业,美国加州大学伯克利分校计算机专业排名一览...
  14. 给小伙伴们的json数据
  15. 阿里云官方学习课程推荐-Linux运维学习路线 从事云计算运维相关工作必备技能
  16. linux中fflush函数和printf函数 【转】
  17. ionic3应该善用组件和指令 (实用、赞)
  18. (Shortest Paths Algorithm)
  19. (转)程序员不爱读书,但这很不明智
  20. RT-Thread学习笔记

热门文章

  1. HTML Input 属性
  2. 语言堆栈入门——堆和栈的区别
  3. MySQL Index详解
  4. Servlet 实例
  5. OpenCV之calib3d 模块. 相机定标和三维重建
  6. 生成学习、高斯判别、朴素贝叶斯—斯坦福ML公开课笔记5
  7. Machine Learning week 3 quiz : Logistic Regression
  8. Python+Django+Eclipse 在Windows下快速开发自己的网站
  9. 如何基于OceanBase构建应用和数据库的异地多活
  10. Spring Cloud Eureka 入门 (三)服务消费者详解