高质量代码
一、Parse与TryParse
我们以Int32为例,首先看一下Int32提供的Parse和TryPase方法:
从Parse和TryParse方法上我们可以看出它们之间的主要区别在于:如果Prase转换失败则会直接抛出异常;而TryParse在转换失败的时候会返回false,并且将out的Int32值设置为0.
如果我们要使用Parse方法来处理任意字符串转换为Int32类型时,则要编写如下代码:

1 string str= ...; 2 Int32 value; 3 try 4 { 5 value = Int32.Parse(str); 6 } 7 catch (Exception) 8 { 9 value = 0; 10 }
代码量与TryParse相比多了许多,接下来我们来测试看两者之间的性能问题,代码如下:

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的时候。
感谢各位博友给出的建议,谢谢。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
2012-04-07 好代码并非一蹴而就-----读《代码整洁之道》