高质量代码
一、Parse与TryParse
我们以Int32为例,首先看一下Int32提供的Parse和TryPase方法:
从Parse和TryParse方法上我们可以看出它们之间的主要区别在于:如果Prase转换失败则会直接抛出异常;而TryParse在转换失败的时候会返回false,并且将out的Int32值设置为0.
如果我们要使用Parse方法来处理任意字符串转换为Int32类型时,则要编写如下代码:
View Code
1 string str= ...; 2 Int32 value; 3 try 4 { 5 value = Int32.Parse(str); 6 } 7 catch (Exception) 8 { 9 value = 0; 10 }
代码量与TryParse相比多了许多,接下来我们来测试看两者之间的性能问题,代码如下:
View Code
1 Int32 count = 1000; 2 string strValue = "123"; 3 Int32 intValue; 4 5 Stopwatch sw = Stopwatch.StartNew(); 6 sw.Start(); 7 for (int i = 0; i < count; i++) 8 { 9 Int32.Parse(strValue); 10 } 11 sw.Stop(); 12 Console.WriteLine("Int32.Parse(\"{0}\") => {1}", strValue, sw.Elapsed); 13 14 sw.Restart(); 15 sw.Start(); 16 for (int i = 0; i < count; i++) 17 { 18 Int32.TryParse(strValue, out intValue); 19 } 20 sw.Stop(); 21 Console.WriteLine("Int32.TryParse(\"{0}\") => {1}", strValue, sw.Elapsed); 22 23 strValue = "a123"; 24 25 sw.Restart(); 26 sw.Start(); 27 for (int i = 0; i < count; i++) 28 { 29 try 30 { 31 Int32.Parse(strValue); 32 } 33 catch (Exception) { } 34 } 35 sw.Stop(); 36 Console.WriteLine("Int32.Parse(\"{0}\") => {1}", strValue, sw.Elapsed); 37 38 sw.Restart(); 39 sw.Start(); 40 for (int i = 0; i < count; i++) 41 { 42 Int32.TryParse(strValue, out intValue); 43 } 44 sw.Stop(); 45 Console.WriteLine("Int32.TryParse(\"{0}\") => {1}", strValue, sw.Elapsed);
得出的结果:
从以上的测试代码中,我们可以看到Parse与TryParse在转换成功的情景下性能是差不多的,但是在转换失败是,Parse性能就差了很多,因此建议应该多多使用TryParse模式。
二、枚举值
我们在编码当中经常会用到枚举,大多数情况下我们都是不会主动去给枚举添加任何默认值的,因为C#默认会给枚举赋值,然而当定义如下枚举时:
1 enum MyEnum 2 { 3 A = 1, 4 B = 2, 5 BC, 6 C = 3 7 }
此时的BC是什么值呢?首先编写测试代码来看看吧:
MyEnum myEnum = MyEnum.BC;
Console.WriteLine(Convert.ToInt32(myEnum));
输出的结果竟然是:3
于是又编写了如下测试代码:
MyEnum myEnum = MyEnum.BC; Console.WriteLine("{0} = {1} => {2}", myEnum, MyEnum.C, myEnum == MyEnum.C);
返回竟然是:true
原因是编译器会给枚举元素逐个+1,当它发现BC并没有默认值的时候,编译器会在B的基础上+1并赋值给BC,因此BC=3,而枚举类型是值类型,因此有了以上的答案。
因此建议大家在使用枚举的时候,应该避免给枚举显式赋值,除非使用FlagsAttribute的时候。
感谢各位博友给出的建议,谢谢。