目录:

  • 建议4:TryParse比Parse好
  • 建议5:使用int?确保值类型也可以为null
  • 建议6:区别 readonly 和 const 的用法

一、建议4:TryParse比Parse 好

TryParse:发生转换异常,内部处理异常。返回false并且result=0

public static bool TryParse(string s, out int result);

Parse:发生转换异常,会抛出异常。

public static decimal Parse(string s);

总结:TryParse会消化异常,Parse不会。如果产生异常,TryParse效率比Parse高。

二、建议5:使用int?确保值类型也可以为null

为什么?~数据库一个int类型的字段可以为null ; 一定的场景下0是有实际意义的,可为了区分0与null.

Nullable<T> 值类型(where T : struct)可拥有null的能力.  简化为:T?(Nullable<int>=int?)

public struct Nullable<T> where T : struct

int? 比  int 多了一个null值:int?=int(可以成功转换);反之 int=int?(需要特殊处理null值)

int?=int

int? nullableNum = null;

int normalNum = ;

nullableNum = normalNum;

int=int?

HasValue属性:判断是否有值;Value属性:具体的值

 int? nullableNum = null;

 int normalNum = ;if (nullableNum.HasValue)
normalNum = nullableNum.Value;
else
normalNum = ;

以上的思路就是:如果 nullableNum 为null,normalNum=0;不为null,就直接赋值。

所以我们可以使用 ?? 简化以上操作

int? nullableNum = null;

int normalNum = ;            

normalNum = nullableNum ?? ;

 当然也就是建议一下,有时缩写反而引起代码可读性降低。

翻开当前做的项目,发现有许多地方需要进行优化:可读性和代码整洁度上都可以优化

if (b.EnablePush)
{
if (b.PushRatio1 != null)
postRatio = b.PushRatio1.Value;
if (b.PushRatio2 != null)
postRatio2 = b.PushRatio2.Value;
}

修改后:

if (b.EnablePush)
{
if (b.PushRatio1.HasValue)
postRatio = b.PushRatio1.Value;
if (b.PushRatio2.HasValue)
postRatio2 = b.PushRatio2.Value;
}

翻开项目,瞅了瞅,有个疑问:有什么区别???????(类似这样)

DateTime t1 = DateTime.Now;            

bool flag = false;

//这句话编译不通过
DateTime? t = flag ? null : t1;

要这样修改才行:

DateTime? t1 = DateTime.Now;            

bool flag = false;

DateTime? t = flag ? null : t1;

或者这样:

DateTime t1 = DateTime.Now;            

bool flag = false;

DateTime? t = flag ? (DateTime?)null : t1;

三、建议6:区别 readonly 和 const 的用法

使用场景:

使用const的是为了效率,但不够灵活。

使用readonly效率不是考虑的首要因素,不过够灵活。

区别:

readonly(只读):运行时常量;修饰类型不限。*readonly 是运行时常量,在第一次为它赋值后就不能再修改。修饰引用类型是引用不变。

const(常量):编译期常量;只能修饰:基元类型、枚举类型或字符串类型。*const是编译期常量,在我们编译完后,值就固定,无法修改。所以也是默认的static修饰。

1、readonly

下面,编译不通过。一旦readonly赋值后,就不能修改。提示也很明确:不能给只读字段赋值。

class People
{
public readonly String NAME="Sunn";
public People()
{
}
}
 People p = new People();
p.NAME = "Yuan";
Console.WriteLine(p.NAME);

但是我们可以在类实例化时,对值进行赋值:

 class People
{
public readonly String NAME="Sunn";
public People()
{
NAME = "Yuan";
}
}

我们平时可能经常见这样写:

public static readonly String NAME="Sunn";

static我们知道是属于类的标识,统一化的行为、共同的行为。非单个实例的行为。如果要修改值,那就需要在静态构造函数中进行赋值。

 class People
{
public static readonly String NAME="Sunn";
static People()
{
NAME = "Yuan";
}
public People()
{
}
}

建议使用:static readonly 组合写法。

2、const

其实是类的常量,加上static反而出错。因为编译器会自动加上static.

 class People
{
public const String NAME = "Sunn";
}

IL代码:发现编译器为我们加上了 static

  .field public static literal string NAME = string('Sunn')

我在想,既然是看作了类的常量,那我们,这样是不行滴~~因为是编译时常量,编译完成后就不能修改值

class People
{
public const String NAME = "Sunn";
static People()
{
NAME = "Yuan";
}
}

读改善c#代码157个建议:建议4~6的更多相关文章

  1. 读改善c#代码157个建议:建议13~15

    目录: 建议13:为类型输出格式化字符串 建议14:正确实现浅拷贝和深拷贝 建议15:使用dynamic来简化反射实现 一.建议13:为类型输出格式化字符串 有些类型需要我们根据业务需求提供字符串的格 ...

  2. 读改善c#代码157个建议:建议10~12

    目录: 建议10:创建对象时需要考虑是否实现比较器 建议11:区别对待==与Equals 建议12:重写Equals时也要重写GetHashCode 一.建议10:创建对象时需要考虑是否实现比较器 比 ...

  3. 读改善c#代码157个建议:建议7~9

    目录: 建议7:将0值作为枚举的默认值 建议8:避免给枚举类型的元素提供显示的值 建议9:习惯运算符重载 一.建议7:将0值作为枚举的默认值 允许使用的枚举类型有:byte.sbyte.short.u ...

  4. 读改善c#代码157个建议:建议1~3

    目录: 建议一:正确操作字符串 建议二:使用默认转型方法 建议三:区别对待强制转型和as 建议一.正确操作字符串 1.确保尽量少的装箱 static void Main(string[] args) ...

  5. 编写高质量代码改善程序的157个建议:第87个建议之区分WPF和WinForm的线程模型

    今天有时间了,继续<编写高质量代码改善程序的157个建议>的阅读,当我阅读到建议87的时候,里面的一些代码示例和文中所说的不一致了,是不是我现在用的是NetFramework 4.0的缘故 ...

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

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

  7. 编写高质量代码:改善Java程序的151个建议 --[117~128]

    编写高质量代码:改善Java程序的151个建议 --[117~128] Thread 不推荐覆写start方法 先看下Thread源码: public synchronized void start( ...

  8. Github即将破百万的PDF:编写高质量代码改善JAVA程序的151个建议

    在通往"Java技术殿堂"的路上,本书将为你指点迷津!内容全部由Java编码的最佳 实践组成,从语法.程序设计和架构.工具和框架.编码风格和编程思想等五大方面,对 Java程序员遇 ...

  9. 每周一书-编写高质量代码:改善C程序代码的125个建议

    首先说明,本周活动有效时间为2016年8月28日到2016年9月4日.本周为大家送出的书是由机械工业出版社出版,马伟编著的<编写高质量代码:改善C程序代码的125个建议>. 编辑推荐 10 ...

随机推荐

  1. python开发_tkinter_小球完全弹性碰撞游戏

    python开发_tkinter_小球完全弹性碰撞游戏   完成这个小球的完全弹性碰撞游戏灵感来自于: 下面是我花了一周下班时间所编写的一个小球完全弹性碰撞游戏: 游戏初始化状态: 最下面的游标和修改 ...

  2. as 的妙用

    个人理解:as跟is is 相当于判断里的“==” 是与否 if(e.OriginalSource is Button) as 一般用来转换另一种object e.OriginalSource as ...

  3. Nginx安装手冊以及图片server部署

    1.      安装gcc yum install gcc 2.      安装pcre,pcre-devel 在zhoulh文件夹下建立source build文件夹 mkdir source bu ...

  4. SO_REUSEADDR 套接字选项应用

    在网络上的SO_REUSEADDR套接字选项是用来解决地址问题重用了大量的信息.但仅仅停留在文字的表达.并没有实例,非常easy误导谁刚开始学习,和不解,此处不再赘述. 的使用该选项,以及须要注意的问 ...

  5. SVN 右下角各种符号

    黄色感叹号(有冲突): --这是有冲突了,冲突就是说你对某个文件进行了修改,别人也对这个文件进行了修改,别人抢在你提交之前先提交了,这时你再提交就会被提示发生冲突,而不 允许你提交,防止你的提交覆盖了 ...

  6. WPF之Binding深入探讨--Darren

    1,Data Binding在WPF中的地位 程序的本质是数据+算法.数据会在存储.逻辑和界面三层之间流通,所以站在数据的角度上来看,这三层都很重要.但算法在3层中的分布是不均匀的,对于一个3层结构的 ...

  7. HT for Web嵌入QtWebKit的client解决方式

    HTML5已经足够强大,但非常多应用还是须要独立桌面client的解决方式,毕竟能操作本地文件等功能还是非常多工具类软件短期内无法全然採用云方案替代. 近期Adobe公布的http://bracket ...

  8. IAR FOR ARM 各版本号,须要的大家能够收藏了

    首先感谢大家的支持与关注,如今应该又一次编辑这篇文章了,这篇文章是非常久曾经不知在什么地方Copy过来的, 非常多问题不知怎么解决,如今我用的是KEIL for arm. 用过Keil和IAR,个人感 ...

  9. Jetty安装学习并展示

    Jetty 的基本架构 Jetty 眼下的是一个比較被看好的 Servlet 引擎,它的架构比較简单,也是一个可扩展性和很灵活的应用server,它有一个基本数据模型,这个数据模型就是 Handler ...

  10. 玩转web之ajax(一)---使用表单的serialize()方法中文乱码解决

    有时候我们需要使用ajax提交去提交form的值,这样就需要使用serialize()去获取form的值,但这样获取的值如果有中文,会乱码,原因和解决方法如下: 原因:.serialize()自动调用 ...