本文借鉴《编写高质量的C#代码:改善C#程序的157个建议》,算是对自己学习的总结,也希望分享下所学知识~~
类型转换,大部分情况下都使用Framework提供的转型方法,包括:
1.使用类型转换运算符,分为隐式转换和显示转换:
int i = 0;
float j = 0;
j = i; // 隐式转换
i = (int)j; //显式转换
2.重载转换运算符:
public static implicit operator ClassA(ClassB b)
{
return new ClassA();
}
不建议重载转换运算符,如果需要转换,都是用过面向对象的角度考虑。
3.内置的Parse,TryParse,或者ToString等方法
下面的代码编译是通过的,但是运行时必会抛出异常,为了简化所以产生了 TryParse 方法。
且抛出异常会造成性能损耗。
try{
string str = "123a";
int number = int.Parse(str);
}
catch
{
throw new InvalidCastException();
}
4.使用CLR支持的转型:
CLR:common language runtime,是运行环境。
核心功能:内存管理,程序集加载,安全性,异常处理,线程同步等等。
(CLR具体有待研究,TODO)
Animal animal = new Dog();
类似继承关系的转换。
Case 1:
优先考虑 is 或者 as 运算符,尽量少用强制类型转换。
因为这样做会比盲目的进行类型转换更加安全,且在运行的时候更有效率。
as 及 is 运算符不会考虑由用户所定义的转换,只有当运行期的类型与要转换到的类型相符时,才会顺利的执行。
object o;
Dog dog = (Dog)o;
if(dog ! = null)
{
//Do things
}
object o;
if(o is Dog)
{
Dog dog = o as Dog;
//Do things
}
这样写更加简单,而且不需要使用try/catch结构,也不需要判断是否为null。
使用 as 运算符,如果转换失败,则返回null。
Case 2
使用 int?
来确保值类型也可以为null。
如果是值类型,无法保存 null,就可以使用 int?
这个类型,也就是 Nullable<int>
,其包含了T的取值+一个null值。
它是一个结构体,声明如下:
public struct Nullable<T> where T : struct
使用起来如下:
int? i = 123;
int j;
if(i.HasValue)
{
j = i .Value;
}
else
{
j=0;
}
//简化版
int? i = 123;
int j = i ?? 0;