建议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】[TryParse比Parse、使用int?来确保值类型也可以为null、readonly和const、0值设为枚举的默认值、避免给枚举类型的元素提供显式的值、习惯重载运算符]的更多相关文章

  1. C#程序编写高质量代码改善的157个建议【16-19】[动态数组、循环遍历、对象集合初始化]

    前言   软件开发过程中,不可避免会用到集合,C#中的集合表现为数组和若干集合类.不管是数组还是集合类,它们都有各自的优缺点.如何使用好集合是我们在开发过程中必须掌握的技巧.不要小看这些技巧,一旦在开 ...

  2. C#程序编写高质量代码改善的157个建议[正确操作字符串、使用默认转型方法、却别对待强制转换与as和is]

    前言 本文主要来学习记录前三个建议. 建议1.正确操作字符串 建议2.使用默认转型方法 建议3.区别对待强制转换与as和is 其中有很多需要理解的东西,有些地方可能理解的不太到位,还望指正. 建议1. ...

  3. C#程序编写高质量代码改善的157个建议【13-15】[为类型输出格式化字符串、实现浅拷贝和深拷贝、用dynamic来优化反射]

    前言 本文已更新至http://www.cnblogs.com/aehyok/p/3624579.html .本文主要学习记录以下内容: 建议13.为类型输出格式化字符串 建议14.正确实现浅拷贝和深 ...

  4. C#程序编写高质量代码改善的157个建议【10-12】[创建对象时需要考虑是否实现比较器、区别对待==和Equals]

    前言 建议10.创建对象时需要考虑是否实现比较器 建议11.区别对待==和Equals 建议12.重写Equals时也要重写GetHashCode 建议10.创建对象时需要考虑是否实现比较器 有对象的 ...

  5. C#程序编写高质量代码改善的157个建议【20-22】[泛型集合、选择集合、集合的安全]

    建议20.使用泛型集合来替代非泛型集合 http://www.cnblogs.com/aehyok/p/3384637.html 这里有一篇文章,是我之前专门来介绍泛型的.我们应尽量的使用泛型集合.因 ...

  6. 编写高质量代码改善C#程序的157个建议——建议130:以复数命名枚举类型,以单数命名枚举元素

    建议130:以复数命名枚举类型,以单数命名枚举元素 枚举类型应该具有负数形式,它表达的是将一组相关元素组合起来的语义.比如: enum Week { Monday, Tuesday, Wednesda ...

  7. 编写高质量代码改善C#程序的157个建议——建议8: 避免给枚举类型的元素提供显式的值

    建议8: 避免给枚举类型的元素提供显式的值 一般情况下,没有必要给枚举类型的元素提供显式的值.创建枚举的理由之一,就是为了代替使用实际的数值.不正确地为枚举类型的元素设定显式的值,会带来意想不到的错误 ...

  8. 编写高质量代码改善C#程序的157个建议——建议7: 将0值作为枚举的默认值

    建议7: 将0值作为枚举的默认值 允许使用的枚举类型有byte.sbyte.short.ushort.int.uint.long和ulong.应该始终将0值作为枚举类型的默认值.不过,这样做不是因为允 ...

  9. 编写高质量代码改善java程序的151个建议——导航开篇

    2014-05-16 09:08 by Jeff Li 前言 系列文章:[传送门] 下个星期度过这几天的奋战,会抓紧java的进阶学习.听过一句话,大哥说过,你一个月前的代码去看下,慘不忍睹是吧.确实 ...

随机推荐

  1. 安装anaconda后启动终端头部会有(base)如何解决

    conda config --show conda config --set auto_activate_base False

  2. day20191205笔记

    Tips: 1.课堂效率 2.每天回顾昨天学习内容,趁热打铁+查漏补缺.(上课笔记,回去补充.) 默写: 1.请说出(访问修饰符)作用域public,private,protected,以及不写时的区 ...

  3. synchronized被这么问,谁能受得了

    synchronized是面试中经常会被问到的知识点,相关的问题点也很多,问题答案涉及的知识点也很多,有经验的面试官就会顺着你的答案不断追问一下,下面的对话场景就是相关面试题的连环炮. 面试官:说一下 ...

  4. 告别编码5分钟,命名2小时!史上最全的Java命名规范参考!

    简洁清爽的代码风格应该是大多数工程师所期待的.在工作中笔者常常因为起名字而纠结,夸张点可以说是编程5分钟,命名两小时!究竟为什么命名成为了工作中的拦路虎. 每个公司都有不同的标准,目的是为了保持统一, ...

  5. zabbix配置

    一:安装zabbix服务端 1.部署准备 命令:iptables -F     #关闭防火墙命令:systemctl stop firewalld    #关闭防火墙 设置解析,自建yum源 命令:c ...

  6. 上手spring boot项目(二)之spring boot整合shiro安全框架

    题记:在学习了springboot和thymeleaf之后,想完成一个项目练练手,于是使用springboot+mybatis和thymeleaf完成一个博客系统,在完成的过程中出现的一些问题,将这些 ...

  7. luogu P1951 收费站_NOI导刊2009提高(2) |二分答案+最短路

    题目描述 在某个遥远的国家里,有n个城市.编号为1,2,3,-,n. 这个国家的政府修建了m条双向的公路.每条公路连接着两个城市.沿着某条公路,开车从一个城市到另一个城市,需要花费一定的汽油. 开车每 ...

  8. Tomcat下载安装并部署到IDEA(附带idea两种热部署设置方法)

    目录 Tomcat下载教程 Tomcat安装教程 Tomcat热部署到IDEA idea两种热部署设置方法 使用Idea的时候,修改了代码,需要反复的重启Tomcat,查看效果,是不是贼烦?还记得刚上 ...

  9. 移动前端不得不了解的HTML5 head 头标签 —— link 标签

    目录 link 标签 rss订阅 不推荐的link标签 favicon 图标 link 标签 说到 link 标签,估计大家的第一反应和我一样,就是引入外部CSS样式文件的,不错,这是 link 标签 ...

  10. 第六章 jQuery选择器

    jQuery选择器概述: 选择器jQuery基础,在jQuery中,对事件处理,遍历DOM和Ajax操作都依赖于选择器. 什么是jQuery选择器: jQuery选择器拥有良好的浏览器兼容性,不用使用 ...