一)用property而非data member===================================
当想让内部的数据被外界访问到时(不管是public还是protected)一定要用Property对于序列和字典,使用indexer,
类的data member永远应该是private,绝无例外,用property,可以得到如下好处:
1、Data binding支持
2、对于需求变化有更强的适应性,更方便修改实现方法
说明:用多花1分钟使用property,会在修改程序以适应设计变化时,节约n小时
Property 示例:
public class Customer
{
private string _name;
public string Name
{
get{return _name;}
}
set
{
if((value==null)||(value.length==0))
{
throw new ArgumentException("Name can not be blank","Name")
}
_name=value;
}
}
二)常量选择 readonly而不是const===============================
C#里有两个不同的版本:运行时常量和编译时常量
关键字readonly来声明一个运行时常量,编译时常量用关键字const声明的
public const int _Millen=2000;
public static readonly int _thisYear=2010;
编译时常量与运行时常量不同之处表现在如何对他们的访问上。
一个编译时常量会被目标代码中的值直接取代,
如 if(myDataTime.Year==_Millen)
会与下面写的代码编译时完全相同的TL代码
if(myDataTime.Year==2000)
运行时常量的值是在运行时确定的,当引用一个只读常量时(readonly)IL会
为你引用一个运行时常量的变量,而不是直接使用该值。
不能使用new运算符初始化一个编译时常量,即使这个数据类型是值类型。
如,这段代码是编译不通过的
private const Datatime _classCreation=new DataTime(2000,1,1,0,0,0);
编译时常量仅限于数字和字符串。只读变量,也就是运行时常量,在构造函数
执行完后它们是不可以被修改的。
运行时常量可以是任何类型的数据,而且必须在构造函数里对他们初始化,或者
可以用任何一个初始化函数来完成。
const的值必须在编译时被确定,它们可以是:属性参数,枚举定义,以及一小部分你认为
应该定义一个值且该值不能在不同的版本发布时发生改变的常量。
无论如何,宁愿选择伸缩性更强的运行时常量
三)选择is或者as操作符而不是做强制类型转换
正确的选择是用as运行符进行类型转换,因为比起盲目的强制转换它更安全。
而且在运行时效率更高。用as和is 运算符进行转换时,并不是对所有的用户定义类型都能完成的,
它们只在运行时类型和目标类型区配的时候,转换才能成功,它们决不会构造一个新的对象来满足(转化)要求
强制转换是不安全的,可能会有异常抛出,因此要用try/catch来保证程序正常运行
而as转换是安全的,不会有此发生,若转换失败,其结果是null
四)用条件属性而不是#if
使用#if/#endif块可以在同样源码上生成不同的编译结果,大多数debug和release两个版本,但它们决不是我们喜欢用的工具
由于#if/#endif很容易被滥用,使得编写的代码难于理解且更难于测试。