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 ...
随机推荐
- 李洪强漫谈iOS开发[C语言-036]-C语言前四天学习小结
- JNI 多线程
一.概述 JNI编程和Linux上的C/C++编程还是挺相似的,每次java调用JNI中的函数时都会传入有关JVM的一些参数(如JNIEnv,jobject),每次JNI回调java中的方法时都要通过 ...
- session跨域共享解决方案
要让session跨域共享,需要解决三个问题: 1.通过什么方法来传递session_id? 2.通过什么方法来保存session信息? 3.通过什么方法来进行跨域? 一.传递session_id有4 ...
- C# 4.0 新特性之并行运算(Parallel)
介绍C# 4.0 的新特性之并行运算 Parallel.For - for 循环的并行运算 Parallel.ForEach - foreach 循环的并行运算 Parallel.Invoke - 并 ...
- WinForm实现简单的拖拽功能(C#)(2)
首先创建一个winform应用程序,添加listbox1与listbox2,拖拽listbox1的项到listbox2上去. 具体代码如下 namespace OLE拖拽{ public partia ...
- poj2723
把每对钥匙看做一个变量,那两个钥匙看做他的两个状态 每一个开门的要求就是一个条件(xi or xj) 很显然有了2sat的基本要素 2sat是一个判定性问题,而这题求最多能过几个门: 不难想到二分答案 ...
- 生成Excel錯誤 遠端程序呼叫失敗。 (發生例外狀況於 HRESULT: 0x800706BE)
错误信息:详细信息:检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005.网上找到 ...
- windows播放声音
一般播放MP3常见的有两种方法,一种是自己解码,另外一种用系统的库,比如MCI,当然如果可以用控件直接用个控件会更方便. 1. 使用mci #include <windows.h> ...
- Nginx实现七层负载均衡配置指导
本文描述了如何使用Nginx实现在应用层实现7层负载均衡功能,Nginx支持虚拟主机,可以按照轮询,IP哈希,URL哈希,权重方式对后端服务器做负载均衡,还支持后端服务器健康检查功能.废话不多说,详细 ...
- tomcat 服务器全解
①B/S.C/S比较 ⑴C/S C/S结构即客户端/服务器(Client/Server),例如QQ: 需要编写服务器端程序,以及客户端程序,例如我们安装的就是QQ的客户端程序: 缺点:软件更新时需要同 ...