Effective C# Chapter1-Language Elements
《EffectiveC#》这本书讲了一些关于C#语言的使用技巧和经验. 该系列文章是备忘录和自己的一些见解.程序猿们最喜欢这类问题了,欢迎讨论~
菜单
Item 1 使用属性取代公共成员变量
Item 2 优先考虑readonly而不是const
Item 3 使用is/as取代转换操作符来进行对象类型转换
Item 4 使用ConditionalAttribute 取代 #if
Item 5 总是提供ToString()方法
Item 6 理解Value Types 和 Referance Types的差别
Item 7 Perfer Immutable Atomic Value Type
Item 8 确保0(对象默认值,default(T)) 是一个有效状态(已定义状态)
Item 9 理解比較关系的方法:ReferanceEquals(), static Equals(), instance Equals() 和 operator ==
Item 10 理解GetHashCode()里的陷阱
Item 11 优先使用foreach
Item 1 使用属性取代公共成员变量
这个是C++转C#程序猿最開始纠结的地方。
1、假设直接是public DataMember ,这肯定不正确,不管是C++还是C#,都须要进行封装。
特别的,在C#中,假设使用DataMember,会导致在跨Assembly使用时,假设该变量有所变化(比方默认值),全部用到该变量的Assembly都得重编译.
这在多DLL的项目里会变成一种灾难.
2、Porperty 和 Indexer 是C#里的概念和语言上的特性类型
那么C++的Access Methods 为什么也不要用了呢?由于Access Methods是C++里的东东; 对成员的訪问控制,使用Property会得到一些C#提供的编程便利,比方能够直接对一个Property应用某个[Attribute],而使用Access Methods则须要分别处理Get 和 Set, 实现起来更加繁琐;
很多其它的语言特性也是基于"Property"的,这个语言属性在反射相关的编码活动中能得到类型上的差别,而Access Methods是编码风格,C#不正确其在语言上直接给予支持。
3、性能没区别
JIT为Property实现的是inline property accessor,所以性能和DataMember等价.
总结:
总是使用属性来向外提供数据訪问的能力(ValueType可能会有特例,比方Vector3, Matrix44之类);
总是使用Indexer来向外提供数据的队列或定位的能力
数据成员所有是private的(或protected,个人看法);
Property和Indexer都不得有异常抛出;
Item 2 优先考虑readonly而不是const
1、C#语言里有两种版本号的常量:编译期常量(const)和执行期常量(readonly)
const在编译成IL的时候,会直接将常量解释成字面值,而readonly则解释成某种引用
2、const效率最高,可是有潜在风险
两者都有价值,const无性能开销,是最高效的,由于直接使用字面值常量来生成IL代码。
关于潜在风险,考虑例如以下一种情况:
程序集的A版本号公布,里面有个const 值为4,因为是DataMember(參考Item1 的理由1),使用该程序集的client全部用到的代码都被编译成4了.
数周后,程序集更新到B版本号,const的值改为5了. 不论什么没又一次编译的相关程序集里该const使用处的地方的值还是4.(被坑过的同学请举手)
3、readonly有一定程度的灵活性,当然也有少量的性能开销
自然,这样的引用会带来性能开销,只是也就是个inline的开销罢了.
Item3 使用is/as取代转换操作符来进行对象类型转换
Item 4 使用ConditionalAttribute 取代 #if
[Conditional("DEBUG")]
void fun()
{
// do something in debug model
}
1、这个函数能够在不论什么地方调用,在编译Release的时候,这个函数和其调用代码就像根本不存在一样。
Item 5 总是提供ToString()方法
Item 6 理解Value Types 和 Referance Types的差别
Item 7 Perfer Immutable Atomic Value Type
strcut Address
{
public int ZipCode{get;set;}
public string CityName{get;set;}
}
struct Address
{
private int _zipCode;
private string _cityName; public int ZipCode
{
get { return _zipCode; }
}
public string CityName
{
get { return _cityName; }
} public Address(int zipCode, string cityName)
{
_zipCode = zipCode;
_cityName = cityName;
}
public void Modify(int zipCode, string cityName)
{
_zipCode = zipCode;
_cityName = cityName;
}
}
public Address Modify(int zipCode, string cityName)
{
return new Address(zipCode, cityName);
}
能够看到,我们仅仅改了一个函数,Modify不再更改对象内部的属性,而是创建了一个新的Address实例返回出去了。那么这个类就是具有 Immutable和Atomic属性的ValueType。
Item 8 确保0(对象默认值,default(T)) 是一个有效状态(已定义状态)
Item 9 理解比較关系的方法:ReferanceEquals(), static Equals(), instance Equals() 和 operator ==
public static bool ReferanceEquals(object left,object right)
public static bool Equals(object left,object right)
public virtual bool Equals(object right)
public static bool operator==(T left, T right)
so many 比較函数...刚从C++过来的人预计一下子就晕了吧。以下的4条分别解释上述4种比較函数的特点和差别。
public static bool Equals(object left,object right)
{
if(left == right)
return true;
if(left==null || right == null)
return false;
return left.Equals(right);
}
能够看到,这个函数先调用==,再调用instance.Equals ,很的完备,是吧?这里是有陷阱的。
Item 10 理解GetHashCode()里的陷阱
Item 11 优先使用foreach
Effective C# Chapter1-Language Elements的更多相关文章
- ABAP CDS - Language Elements
The following sections summarize the language elements of the DDL and DCL of the ABAP CDS, arranged ...
- 《C Elements of Style》 书摘
<C Elements of Style> 书摘 学完C语言和数据结构后,虽然能解决一些问题,但总觉得自己写的程序丑陋,不专业.这时候看到了Steve Oualline写的<C El ...
- 【翻译二十三】java-并发程序之随机数和参考资料与问题(本系列完)
Concurrent Random Numbers In JDK 7, java.util.concurrent includes a convenience class, ThreadLocalRa ...
- Java 专业人士必备的书籍和网站列表
对于 Java™ 语言开发人员来说,信息过量是一个真正的问题.每个新入行的程序员都要面临一个令人畏缩的挑战:要进入的行业是一个具有海量知识的行业.要了解的东西简直 太多了.对于有经验的老手来说,情况只 ...
- 从零开始学C++之RTTI、dynamic_cast、typeid、类与类之间的关系uml
一.RTTI Run-time type information (RTTI) is a mechanism that allows the type of an object to be deter ...
- 【转】安卓必备Java基础
[转]http://www.zhihu.com/question/19937886(里面提到的知识点的链接) 1. Java 语言基础 谈到Java 语言基础学习的书籍,大家肯定会推荐Bruce Ec ...
- JAVA程序员必看的15本书-JAVA自学书籍推荐
作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从.我想就我自己读过的技术书籍中挑选出来一些,按照学习的先后顺序,推荐给大家,特别是那些想不断提高自己技术水 ...
- Java面试知识1
JAVA面试题集 基础知识: 1.C++或Java中的异常处理机制的简单原理和应用. 当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常.违反语义规则包括2 ...
- 沉淀再出发:java中的equals()辨析
沉淀再出发:java中的equals()辨析 一.前言 关于java中的equals,我们可能非常奇怪,在Object中定义了这个函数,其他的很多类中都重载了它,导致了我们对于辨析其中的内涵有了混淆, ...
- RTTI、dynamic_cast、typeid、类与类之间的关系uml
一.RTTI Run-time type information (RTTI) is a mechanism that allows the type of an object to be deter ...
随机推荐
- 【Quick 3.3】资源脚本加密及热更新(二)资源加密
[Quick 3.3]资源脚本加密及热更新(二)资源加密 注:本文基于Quick-cocos2dx-3.3版本编写 一.介绍 在前一篇文章中介绍了代码加密,加密方式是XXTEA.对于资源文件来说,同样 ...
- EventLog实现事件日志操作
选中”我的电脑”,在其右键菜单中选择“管理”,在打开的对话框中包括了如下图所示的“日志”信息: 选中其中的某一条日志,可以看到如下的详细信息: 我们应该如何通过写代码的方式向其中添加“日志”呢? 在操 ...
- 【HDOJ】2045 不容易系列之(3)—— LELE的RPG难题
着色问题,递推,当超过3个块时,规律明显,此时可以是n-2的头尾重复+与头尾不同颜色,也可以是n-1+与头尾均不相同眼色情况.经典递推.注意long long. #include <stdio. ...
- PO > Create PO时关于汇率问题需要注意的步骤
为了使得RMB采购的PO在审核时不会提示汇率丢失(如下图),在创建PO时需要注意几个步骤. 1)手动创建PO:在建立PO行之前,应该选择好正确的"地点","币 ...
- iis 5.1 连接 sql 2005
VS2005+SQL2005 ASP.NET2.0数据库连接总结 通过上篇文章(http://www.cnblogs.com/user34j/archive/2007/01/23/628426.htm ...
- nginx-rrd监控nginx访问数
一 .查看已安装的nginx是否包含stub_status模块 /usr/local/nginx/sbin/nginx -V nginx version: Nginx/1.2.0 configure ...
- c语言输入与输出库函数#include<stdio.h>
last modified: 2010-05-28 输入与输出<stdio.h> 头文件<stdio.h>定义了用于输入和输出的函数.类型和宏.最重要的类型是用于声明文件指针的 ...
- Extjs4-treepanel-解析json/fields中是否加入leaf的区别
json解析list时,我原先的写法是: Map<String, Object> map = new HashMap<String, Object>(); map.put(&q ...
- ReaderWriterLock类(转)
ReaderWriterLock类 通常来讲,一个类型的实例对于并行的读操作是线程安全的,但是并行地更新操作则不是(并 行地读和更新也不是). 这对于资源也是一样的,比如一个文件.当保护类型的实例安全 ...
- Nginx配置中运行与启动的详细介绍【转】
原文:http://developer.51cto.com/art/201003/190944.htm 我们在进行Nginx配置的时候会出现很多不明白的地方,其实有些时候只要换一个思维的方式就能找多你 ...