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 ...
随机推荐
- 自编的CHtmlView浏览器,怎么截获超连接,不让新窗口在IE中打开
blog <自编的CHtmlView浏览器,怎么截获超连接,不让新窗口在IE中打开> http://bbs.csdn.net/topics/10299197 http://so ...
- Bamboo简介
前言 前面介绍了JIRA管理平台,那么本篇就来介绍关于自动编译项目的工具-Bamboo. 正题 1.简介 Atlassian Bamboo 是一款持续集成构建服务器软件(Build Serve ...
- Android开发UI之Fragment-Tabbed Activity的使用
使用ADT新建的时候,可以选择Tabbed Activity,选择新建一个工程. 新建的工程中,选择不同的Tab页显示不同的内容,主要是通过SectionsPagerAdapter类中的Fragmen ...
- 结构体dict_index_t;
/** InnoDB B-tree index */ typedef struct dict_index_struct dict_index_t; /** Data structure for an ...
- NOI2011道路修建
2435: [Noi2011]道路修建 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1974 Solved: 550[Submit][Status ...
- jQuery-单击文字或图片内容放大显示效果插件
css很强大,jQuery也很强大,两者结合在一起就是无比强大.这里要介绍的这个单击文字或图片内容放大居中显示的效果就是这两者结合的产物. 先来介绍css和jQuery各自发挥了什么作用吧: css: ...
- 分布式缓存系统Memcached简介与实践(.NET memcached client library)
缘起: 在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载.缓存是解决这个问题的好办法.但是ASP.NET中的虽然已经可以实现对页面局部进行缓存,但还是不够灵 ...
- 使用Arcglobe 10与3dmax建立三维城市
转自:http://www.cnblogs.com/jinlun/p/3380307.html 随着国家大力推进数字城市的建设,三维城市的建设也是势在必行的.与传统二维地图相比,三维城市在立体层次.视 ...
- [转]ASP.NET MVC 入门5、View与ViewData
view在MVC模式中与用户进行最直接的接触,它负责数据的呈现.这里要注意一点就是,view只是负责数据的呈现,所以我们应该要尽量让view中不涉及业务逻辑的处理. 我们来添加一个Blog首页的vie ...
- CCClippingNode bug
在Cocos2d-x v2.x,CCClippingNode类有一个bug,导致区域裁剪失效,由于Cocostudio的UIScrollview组件是基于该类构建的,所以这个问题是比较常见的,fix的 ...