编写高质量代码改善C#程序的157个建议[4-9]
前言
本文首先亦同步到http://www.cnblogs.com/aehyok/p/3624579.html。本文主要来学习记录一下内容:
建议4、TryParse比Parse好
建议5、使用int?来确保值类型也可以为null
建议6、区别readonly和const的使用方法
建议7、将0值设为枚举的默认值
建议8、避免给枚举类型的元素提供显式的值
建议9、习惯重载运算符
建议4、TryParse比Parse好
如果注意观察,除string之外的所有的基元类型。会发现它们都有两个将字符串转换为自身类型的方法:Parse和TryParse。以类型double为例。
两者最大的区别是,如果字符串格式不满足转换的要求,Parse方法将会引发一个异常;TryParse方法则不会引发异常,它会返回false,同时将result置为0。
//Parse int a = int.Parse("123a"); //TryParse int x = 0; if (int.TryParse("12a3", out x)) {//转换成功,x=123 } else {//转换失败,x=0 }
Parse转换失败会运行时报错
而TryParse转换失败返回false,将其赋值为0
TryParse和Parse两者都执行成功,那么TryParse的性能要比Parse性能稍微好一点,但是如果抛出异常,那么TryParse的性能比Parse提升了不少额。
不过这里并不建议为所有的类型都提供TryParse模式,只有在考虑到Parse会带来明显的性能损耗时,才建议使用TryParse。
建议5、使用int?来确保值类型也可以为null
基元类型为什么需要为null?需要考虑以下两个场景:
1、数据库中一个int字段可以被设置为null。在C#中,值被取出来后,为了将它赋值给int类型,不得不首先判断一下它是否为null。如果将null直接赋值给int类型,会引发异常。
2、在一个分布式系统中,服务器需要接收并解析来自客户端的数据。一个int型数据在传输的过程中可能会丢失或者被篡改。转型失败后应该保存为null值,而不是提供一个默认值。
类似的场景还有很多,在这里不进行更详尽的列举。在.NET2.0开始,便提供了一个额外的类型:可以为空的类型Nullable<T>。
通过定义可以发现,它是一个结构体。因为是结构体,所以只有值类型才可以作为“可以为空的类型”(引用类型本身可以为null)。一个可以为空的int类型可以表示为
Nullable<int> intA = null;
它也可以表示为
int? intA = null;
当然之后可以这样进行应用
int? i=123;int j = i ?? 0;
建议6、区别readonly和const的使用方法
关于两者的使用我之前也有专门介绍过,在这里就一笔带过:http://www.cnblogs.com/aehyok/p/3529079.html。
建议7、将0值设为枚举的默认值
允许使用的枚举类型有byte、sbyte、short、ushort、int、uint、long、ulong、应该始终将0值作为枚举的默认值。接下来我们通过示例来说明问题
enum Week{Money = 1,Tuesday = 2,Wednesday = 3,Thursday = 4,Friday = 5,Saturday = 6,Sunday = 7}
在调用的时候发现
结果竟然出来了一个0,让人感觉怎么是第八个值出现了。所以建议将0设置为枚举的默认值。
建议8、避免给枚举类型的元素提供显式的值
一般情况下,没有必要给枚举类型的元素提供显式的值。创建枚举的理由之一,就是为了代替使用实际的值。不正确的为枚举类型的元素设定显式的值,会带来意想不到的错误。
enum Week{Money = 1,Tuesday = 2,TempValue,Wednesday = 3,Thursday = 4,Friday = 5,Saturday = 6,Sunday = 7}
假如我们在如上枚举中,又添加了一个TempValue的元素。可以先猜测一下此时TempValue的值会是多少?
通过调试可以发现。当编译器发现元素ValueTemp的时候,它会自动在Tuesday=2的基础上+1,所以ValueTemp的值和Wednesday的值都是3。可见,枚举元素允许设定重复的值。
注意: 本建议也有例外的情况。例如,当为一个枚举类型指定System.FlagsAttribute属性就意味着可以为这些值执行And、Or、Not、Xor按位运算了,这样一来,枚举的每个元素的值就要求都是2的若干次幂,指数依次递增。
[Flags]enum Week{None = 0x0,Money = 0x1,Tuesday = 0x2,Wednesday = 0x4,Thursday = 0x8,Friday = 0x10,Saturday = 0x20,Sunday = 0x40}
按位运算在这里不多说了,详情可以查看 http://www.cnblogs.com/NetBelieve/archive/2012/07/30/2615006.html
建议9、习惯重载运算符
在开发的过程中,应该习惯于使用微软提供给我们的语法特性。我想大部分人应该喜欢看到这样的语法特性:
int x = 7;int y = 8;int total = x + y;
而不是看到下面的语法:
int x = 7;int y = 8;int total = int.Add(x, y);
所以我们在自定义类型的时候,也可以考虑看看类型是否可以使用运算符重载。
public class Salary{public int RMB { get; set; }public static Salary operator +(Salary s1, Salary s2){s2.RMB += s1.RMB;return s2;}}
那现在我们来进行调用的时候就方便了很多。
Salary s1 = new Salary() { RMB = 10 };Salary s2 = new Salary() { RMB = 20 };Salary s3 = s1 + s2;
编写高质量代码改善C#程序的157个建议[4-9]相关推荐
- 编写高质量代码改善C#程序的157个建议——建议148:不重复代码
建议148:不重复代码 如果发现重复的代码,则意味着我们需要整顿一下,在继续前进. 重复的代码让我们的软件行为不一致.举例来说,如果存在两处相同的加密代码.结果在某一天,我们发现加密代码有个小Bug, ...
- 编写高质量代码改善C#程序的157个建议——建议86:Parallel中的异常处理
建议86:Parallel中的异常处理 建议85阐述了如何处理Task中的异常.由于Task的Start方法是异步启动的,所以我们需要额外的技术来完成异常处理.Parallel相对来说就要简单很多,因 ...
- 编写高质量代码改善C#程序的157个建议——建议87:区分WPF和WinForm的线程模型...
建议87:区分WPF和WinForm的线程模型 WPF和WinForm窗体应用程序都有一个要求,那就是UI元素(如Button.TextBox等)必须由创建它的那个线程进行更新.WinForm在这方面 ...
- 编写高质量代码改善C#程序的157个建议——建议127:用形容词组给接口命名
建议127:用形容词组给接口命名 接口规范的是"Can do",也就是说,它规范的是类型可以具有哪些行为.所以,接口的命名应该是一个形容词,如: IDisposable表示可以被释 ...
- 编写高质量代码改善C#程序的157个建议——建议133:用camelCasing命名私有字段和局部变量...
建议133:用camelCasing命名私有字段和局部变量 私有变量和局部变量只对本类型负责,它们在命名方式也采用和开放的属性及字段不同的方法.camelCasing很适合这类命名. camelCas ...
- 编写高质量代码改善C#程序的157个建议——建议104:用多态代替条件语句
建议104:用多态代替条件语句 假设要开发一个自动驾驶系统.在设计之初,此自动驾驶系统拥有一个驾驶系统命令的枚举类型: enum DriveCommand{Start,Stop} 当前该枚举存在两个命 ...
- 编写高质量代码改善C#程序的157个建议——建议157:从写第一个界面开始,就进行自动化测试...
建议157:从写第一个界面开始,就进行自动化测试 如果说单元测试是白盒测试,那么自动化测试就是黑盒测试.黑盒测试要求捕捉界面上的控件句柄,并对其进行编码,以达到模拟人工操作的目的.具体的自动化测试请学 ...
- 编写高质量代码改善C#程序的157个建议——建议130:以复数命名枚举类型,以单数命名枚举元素...
建议130:以复数命名枚举类型,以单数命名枚举元素 枚举类型应该具有负数形式,它表达的是将一组相关元素组合起来的语义.比如: enum Week{Monday,Tuesday,Wednesday,Th ...
- 编写高质量代码改善C#程序的157个建议——建议50:在Dispose模式中应区别对待托管资源和非托管资源...
建议50:在Dispose模式中应区别对待托管资源和非托管资源 真正资源释放代码的那个虚方法是带一个bool参数的,带这个参数,是因为我们在资源释放时要区别对待托管资源和非托管资源. 提供给调用者调用 ...
- 编写高质量代码改善C#程序的157个建议——建议9: 习惯重载运算符
建议9: 习惯重载运算符 在开发过程中,应该习惯于使用微软提供给我们的语法特性.我想每个人都喜欢看到这样的语法特性: int x = 1; int y = 2; int total = x + y; ...
最新文章
- Nature Microbiology:火眼金睛,肠道菌群绝对定量分析擒“真凶”!
- mysql批量提交的优化
- python接口自动化(三十四)-封装与调用--函数和参数化(详解)
- [保存]C# 使用HttpWebRequest提交ASP.NET表单并保持Session和Cookie
- MFS分布式文件系统搭建
- java constants无法使用_轻松看懂Java字节码
- android avrcp处理流程,android 蓝牙avrcp功能的实现.doc
- React Native踩坑新建的RN0.64项目无法在xcode 12.5上打开
- SimpleDateFormat 使用TimeZone
- Markdown编辑器 - 字体颜色表(颜色名、十六进制颜色值、颜色)
- 【连载】线性代数笔记——第二章矩阵
- 无人机航模电池上面有20C 30C,这是放电倍率
- 如何设置Java环境变量
- oracle 查询指定时间范围
- Android实现手机静音
- C++ opencv imread读不进来图片
- 入门级Node.js express服务端开发_Android签到APP
- QNAP 威联通NAS ts-453bmini ups断电自动关机
- 微信小程序-场景值得运用与理解
- 大家好!我是屁孩君儿子,今天给大家带来一个 1085 球弹跳高度的计算
热门文章
- [Ext JS]5.8 Group Grid-分组网格
- Spring Boot + Activiti 工作流框架搭建
- Windows下使用Git配置SSH免密登录
- Synergy,一个软件团队质量改进之路之一 --- 规划
- Teamcenter 开发中的一些问题
- linux然后防止ip欺骗,linux – 如何在iptables中防止ip欺骗?
- 句子分类_Bert做新闻标题文本分类
- 计算机三级之嵌入式系统学习笔记7
- 多线程安全小结-可见性(内存屏障,共享变量副本)、原子性、有序性(编译器优化、cpu流水线乱序)
- servlet ---- 响应对象