Effective C# 摘录(1) - C# Language Elements
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相关推荐
- Effective C# 摘录(3) - 使用C#表达设计
19:定义并实现接口优于继承类型. Prefer Defining and Implementing Interfaces to Inheritance. 接口支持多重继承,可以作用于值类 ...
- BERT论文阅读(一): Pre-training of Deep Bidirectional Transformers for Language Understanding
BERT三大核心: pre-training bidirectional==>alleviates the unidirectionality constriant of fine-tuning ...
- Paper:《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding用于语言理解的深度双向Tr
Paper:<BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding用于语言理解的深度双 ...
- Paper:GPT之《Improving Language Understanding by Generative Pre-Training》翻译与解读
Paper:GPT之<Improving Language Understanding by Generative Pre-Training>翻译与解读 目录 GPT之<Improv ...
- 《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 ...
- Interview QA-COBOL COBOL II
Q1) Name the divisions in a COBOL program ?. A1) IDENTIFICATION DIVISION, ENVIRONMENT DIVISION, DATA ...
- CheckStyle:Checks之标准Checks
标准Checks 标准Checkstyle Checks适用于常规Java编码样式,并且不需要外部库. Checkstyle提供了许多可应用于源代码的检查.以下是按字母顺序排列的参考. Checker ...
- 如何写出一份真正让您受聘的出色简历
This is a data-driven guide to writing a resume that actually gets you hired. I've spent the past fo ...
- Go函数及与函数相关机制 【Go语言圣经笔记】
函数 函数可以让我们将一个语句序列打包为一个单元,然后可以从程序中其它地方多次调用.函数的机制可以让我们将一个大的工作分解为小的任务,这样的小任务可以让不同程序员在不同时间.不同地方独立完成.一个函数 ...
最新文章
- Recipe 1.6. Converting Between Characters and Values
- 商城网站前期功能设置这几项绝不能少!
- 专家提醒:计算机专业毕业生求职三要点!
- Caffe学习系列(16):各层权值参数可视化
- 到底什么是hash partition?
- WINCE字体动态加载
- 【HDU - 1599】find the mincost route (Floyd最小环,最短路问题)
- QT每日一练day14:QFontDialog字体对话框
- win7下的ipython没有的问题
- Node.js编写CLI的实践
- 编写GOM引擎登录器,直接启动GOM客户端DAT文件不掉线
- 凭什么?80后合伙人“叫板Excel”
- 加利福尼亚大学圣地亚哥分校计算机科学专业,美国加州大学伯克利分校计算机专业排名一览...
- 给小伙伴们的json数据
- 阿里云官方学习课程推荐-Linux运维学习路线 从事云计算运维相关工作必备技能
- linux中fflush函数和printf函数 【转】
- ionic3应该善用组件和指令 (实用、赞)
- (Shortest Paths Algorithm)
- (转)程序员不爱读书,但这很不明智
- RT-Thread学习笔记