读改善c#代码157个建议:建议4~6
目录:
- 建议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的更多相关文章
- 读改善c#代码157个建议:建议13~15
目录: 建议13:为类型输出格式化字符串 建议14:正确实现浅拷贝和深拷贝 建议15:使用dynamic来简化反射实现 一.建议13:为类型输出格式化字符串 有些类型需要我们根据业务需求提供字符串的格 ...
- 读改善c#代码157个建议:建议10~12
目录: 建议10:创建对象时需要考虑是否实现比较器 建议11:区别对待==与Equals 建议12:重写Equals时也要重写GetHashCode 一.建议10:创建对象时需要考虑是否实现比较器 比 ...
- 读改善c#代码157个建议:建议7~9
目录: 建议7:将0值作为枚举的默认值 建议8:避免给枚举类型的元素提供显示的值 建议9:习惯运算符重载 一.建议7:将0值作为枚举的默认值 允许使用的枚举类型有:byte.sbyte.short.u ...
- 读改善c#代码157个建议:建议1~3
目录: 建议一:正确操作字符串 建议二:使用默认转型方法 建议三:区别对待强制转型和as 建议一.正确操作字符串 1.确保尽量少的装箱 static void Main(string[] args) ...
- 编写高质量代码改善程序的157个建议:第87个建议之区分WPF和WinForm的线程模型
今天有时间了,继续<编写高质量代码改善程序的157个建议>的阅读,当我阅读到建议87的时候,里面的一些代码示例和文中所说的不一致了,是不是我现在用的是NetFramework 4.0的缘故 ...
- 编写高质量代码改善java程序的151个建议——导航开篇
2014-05-16 09:08 by Jeff Li 前言 系列文章:[传送门] 下个星期度过这几天的奋战,会抓紧java的进阶学习.听过一句话,大哥说过,你一个月前的代码去看下,慘不忍睹是吧.确实 ...
- 编写高质量代码:改善Java程序的151个建议 --[117~128]
编写高质量代码:改善Java程序的151个建议 --[117~128] Thread 不推荐覆写start方法 先看下Thread源码: public synchronized void start( ...
- Github即将破百万的PDF:编写高质量代码改善JAVA程序的151个建议
在通往"Java技术殿堂"的路上,本书将为你指点迷津!内容全部由Java编码的最佳 实践组成,从语法.程序设计和架构.工具和框架.编码风格和编程思想等五大方面,对 Java程序员遇 ...
- 每周一书-编写高质量代码:改善C程序代码的125个建议
首先说明,本周活动有效时间为2016年8月28日到2016年9月4日.本周为大家送出的书是由机械工业出版社出版,马伟编著的<编写高质量代码:改善C程序代码的125个建议>. 编辑推荐 10 ...
随机推荐
- 谷歌下解决Pop遮罩层无法遮挡滚动栏下问题
今天用pop的弹出窗体里,出现一个问题,当网页出现滚动栏里,不能遮挡住,解决Pop遮罩层无法遮挡滚动栏下问题. 可通过下载获取改动后的代码----->进入下载
- socket用法
INADDR_ANY是ANY,是绑定地址0.0.0.0上的监听, 能收到任意一块网卡的连接:INADDR_LOOPBACK, 也就是绑定地址LOOPBAC, 往往是127.0.0.1, 只能收到127 ...
- google多语言通信框架gRPC
google多语言通信框架gRPC系列(一)概述 gRPC概述 3/26/2016 9:16:08 AM 目录 一.概述 二.编译gRPC 三.C#中使用gRPC 四.C++中使用gRPC 一直在寻找 ...
- java HashMap中出现反复的key, 求解释
上代码: Person p1 = new Person("xiaoer",1); Person p2 = new Person("san",4); Map< ...
- 程序员之---C语言细节22(函数返回指针注意事项<悬空指针>、查看进程能够分配的内存大小)
主要内容:函数返回指针注意事项<悬空指针>.查看进程能够分配的内存大小 #include <stdio.h> char * favorite_fruit() { static ...
- C#实现远程机器管理
原文:C#实现远程机器管理 目前处于待离职状态,原先所有的工作都在进行交接,过程当中不乏有很多先前整理的和动手尝试实现的功能:我的主页中已经列出来一部分内容,有兴趣的可以前往看一看. 接下来的内容主要 ...
- 关于VCL的编写 (一) 如何编写自己的VCL控件
如何编写自己的VCL控件 用过Delphi的朋友们,大概对Delphi的最喜欢Delphi的不是他的强类型的pascal语法,而是强大的VCL控件,本人就是一位VCL控件的爱好者. VCL控件的开源, ...
- Linux - SVN下载项目
SVN下载项目 本文地址:http://blog.csdn.net/caroline_wendy 使用SVN.在Git上下载项目. $ mkdir chunyu_trunk //创建目录 $ ls / ...
- C# 5.0 Async函数的提示和技巧
一.创建Async函数 Async是C# 5.0中新增的关键字,通过语法糖的形式简化异步编程,它有如下三种方式: async Task<T> MyReturningMethod { ret ...
- javascript从定义到执行 js引擎 闭包
javascript从定义到执行,JS引擎在实现层做了很多初始化工作,因此在学习JS引擎工作机制之前,我们需要引入几个相关的概念:执行环境 栈.全局对象.执行环境.变量对象.活动对象.作用域和作用域链 ...