换失败的时候触发的异常所带来的性能消耗;
在效率方面,如果Parse和TryParse都执行成功的话,它们的效率是在同一个数量级的,甚至在书中的实验中,TryParse还比
Parse高,如果Parse和TryParse都执行失败的话,Parse的执行效率就大大低于TryParse了。
建议5:使用int?确保值类型也可以为null
在开发的过程中,可能你也遇到过值类型不够用的场景,比如,数据表字段设置为int类型,并且允许为null,这时反映在C#
中,如果将null赋值给int类型的变量也不对,会报错;
所以,从.NET2.0开始,FCL提供一种可以为Null的类型Nullable<T> 它是一个结构体:
public struct Nullable<T> where T: struct
但是结构体Struct是值类型,应该也不能为空才对啊,书中也没有解释得很深入,很模糊的一两句就带过了,于是我继续深入
探讨,首先使用Reflector对mscorlib.dll反编译;
public struct Nullable<T> where T: struct
{
private bool hasValue;
internal T value;
public Nullable(T value);
public bool HasValue { get; }
public T Value { get; }
public T GetValueOrDefault();
public T GetValueOrDefault(T defaultValue);
public override bool Equals(object other);
public override int GetHashCode();
public override string ToString();
public static implicit operator T?(T value);
public static explicit operator T(T? value);
}
不知道什么原因,当我展开这些方法的时候,都是空空的,但是,我发现它有重载转换运算符,implicit 是隐式转换,explicit
是显式转换
然后在写一个小程序,代码如下:
protected void Page_Load(object sender, EventArgs e)
{
Nullable<int> a = null;
}
然后对这个web应用程序进行反编译查看:
protected void Page_Load(object sender, EventArgs e)
{
int? a = new int?();
}
可以看出,Nullable<int> a = null; 最终是进行了初始化,而此时,hasValue属性的值也应该为False;
所以,我猜想,Nullable<int> 或者 int? ……等可空的基元类型设置为null的时候,实际上并不是像引用类型那样为null了,而
是进行了初始化,并且hasValue属性的值为False。
猜想完之后,我去MSDN搜了一下,得到验证:http://msdn.microsoft.com/zh-cn/library/ms131346(v=vs.100).aspx
建议6:区别readonly和const的使用方法
这个建议我打算自己写一个比较简明的例子来说明,而不使用书本的例子,即使有些工作几年的朋友,也可能一下子说不清楚
const与readonly的区别,感觉它们实现的效果也是一样的,都表示一个不可变的值,其实它们的区别在于:
·const是编译时常量(编译时确定下来的值)
·readonly是运行时常量(运行时才确定)
下面建立一个DEMO来举例说明:
1、新建一个类库,新建Person类,设置如下两个常量: