- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章编写高质量代码的30条黄金守则(首选隐式类型转换)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
编写高质量代码的30条黄金守则-day 01(首选隐式类型转换),本文由比特飞原创发布,转载务必在文章开头附带链接:https://www.byteflying.com/archives/6455 。
该系列文章由比特飞原创发布,计划用三个月时间写完全30篇文章,为大家提供编写高质量代码的一般准则.
1、概述 。
隐式类型转换是微软为了 c# 支持匿名类型而加入的,使用 var 通常可以使代码的可读性更强,甚至是帮我们解决一些严重的性能问题。为了清楚的明白 var 的作用机制,我们首先来看看编译器为 var 做了哪些工作?
2、编译器为var关键字做了什么?
首先 var 为语法糖,编译器在编译时根据右值推断出表达式类型,再由编译器将推断出的表达式类型写入到 il 中,所以如下2段代码在 il 中完全一致.
编译期间,编译器根据右值“somestring”,可以推断出这个表达式(右值)的类型为 string 类型,于是将var替换为string,再将它写到il中,于是以上两段初始化foo的代码结果完全一致.
1
2
|
string
foo =
"somestring"
;
var foo =
"somestring"
;
|
我们再来看一下两段代码的il:
。
本文示例的源代码 。
dnspy 的反编译结果 。
。
microsoft 技术支持文档中 ldstr 的解释 。
注意:string也是语法糖,编译时,string被替换为system.string写进il.
于是我们得到了一个重要的结论:
var为语法糖,在编译期间就已经被编译器所决定,开发人员无法为编译器决定类型.
隐式类型转换为上述代码带来了良好的可读性,任何一名开发人员都会知道第2行代码的var的类型,它让我们更加的关注代码片段中我们所需要关注的部分,而不是把重点放在它的类型上。因为大多数时候,这都是没有意义的.
3、隐式类型转换所带来的良好可读性 。
为了明白良好可读性的问题,我们先来看一个代码片段:
1
|
var foo =
new
sometype();
|
以上代码清晰明了,对于维护代码的人来说,它没有增加任何的理解成本,foo的类型就是sometype类型。很多优秀开源项目中的大量被使用的工厂模式,也提供了类似的方法,如下代码片段:
1
|
var huawei = phonefactory.createphone();
|
一个简单的静态工厂类 phonefactory ,公开了 createphone 方法,阅读这段代码的开发人员,在几乎没有增加理解成本的情况下,很清楚的知道huawei代表手机工厂类所生产的一个手机对象。但是下面的代码,情况可能就稍有不同了:
1
|
var result = someobject.dosomething(someparameter);
|
你无法轻松的知道result的类型和它所表达的意义,事实上,它的不良好的可读性,表现在以下几个方面:
1、在此处,result这个变量名并不是最好的选择; 。
2、someobject的含义不明; 。
3、dosomething含糊不清; 。
4、无法明确的知道someparameter代码什么.
如果换成以下代码,情况会好很多:
1
|
var mostpopularphone = someobject.dosomething(someparameter);
|
情况有所好转,意思也更清楚。结合语义上下文,var的类型不言自明。但是在这种情况下,我依然建议大家将代码改为以下形式:
1
|
phone mostpopularphone = someobject.dosomething(someparameter);
|
这被我写在之前所在公司的开发手册上,我相信我的经验一定是正确的.
让我们再来看一个新的示例:
1
2
3
|
var score = getsomenumber();
var rate = score / 100;
|
rate的类型由变量score决定,然后开发者无法一眼看出score的类型,所以这是一个不良好的可读性的代码片段,我们应该改为:
1
2
3
|
var score = getsomenumber();
double
rate = score / 100;
|
怎么样,是不是看到这样的代码,心里舒服多了?因为你的理解成本更低了,心情舒畅了,一下子搬砖都能搬到5楼了.
于是,我们有了两点总结:
1、当含义明确,在代码上下文较为清楚时(简单的变量定义或工厂方法),建议优先使用var; 。
2、在其它复杂情况下,尽量直接写出var的类型.
隐式类型转换所带来的绝非仅仅是良好的可读性,它有时可能会帮我们消除一些难以发现的bug,这又是怎么回事呢?
4、隐式类型转换帮我们解决严重的性能问题 。
人自以为自己是世界上最聪明的生物,事实上并非如此,有时候,编译器比我们聪明得多,也可靠得多.
我们看看以下两个代码片段:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public
ienumerable<
string
> getphonestartswith1(
string
prefix) {
ienumerable<
string
> phones =
from r
in
db.phones
select r.phonename;
var result = phones.where(r => r.startswith(prefix));
return
result;
}
public
ienumerable<
string
> getphonestartswith2(
string
prefix) {
var phones =
from r
in
db.phones
select r.phonename;
var result = phones.where(r => r.startswith(prefix));
return
result;
}
|
以上两段代码有何不同?getphonestartswith1 方法中的 phones 原先的返回类型应当为 iqueryable<string>,但在这里被显式声明的 phones 的 ienumerable<string> 强制转换了,熟悉 ef 的朋友们一定知道,iqueryable<t> 为延迟加载,本身并不会立刻查询数据库,事实上它只生成了一个表达式树,在最终需要使用数据的时候才会真正执行查询动作.
于是 getphonestartswith1 方法将数据库中的可能的所有数据全部取回本地,再由 var result = phones.where(r => r.startswith(prefix)); 执行本地过滤,消耗了太多网络资源,并且使用了 .net 的数据过滤机制.
getphonestartswith2 方法则不然,phones 的类型被编译器推断为 iqueryable<string> ,并不会因此执行查询操作,真正的查询动作由 var result = phones.where(r => r.startswith(prefix)); 执行,也就是说,它的数据过滤动作由数据库引擎负责运算,最终只将符合条件的数据发送回本地,既节省了网络传递成本,又节省了运算成本,岂不是一举两得?
5、总结 。
开发人员应牢记以上开发守则,否则,人民群众会仇恨你,你的朋友和家人也会嘲笑你,唾弃你.
该系列文章由比特飞原创发布,计划用三个月时间写完全30篇文章,为大家提供编写高质量代码的一般准则.
总结 。
到此这篇关于编写高质量代码的30条黄金守则(首选隐式类型转换)的文章就介绍到这了,更多相关编写高质量代码的30条黄金守则内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://www.cnblogs.com/byteflying/p/13472918.html 。
最后此篇关于编写高质量代码的30条黄金守则(首选隐式类型转换)的文章就讲到这里了,如果你想了解更多关于编写高质量代码的30条黄金守则(首选隐式类型转换)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我面临以下问题:我有几个 UIImage(不是方形的),我需要调整它们的大小并裁剪它们。我已经阅读了关于 StackOverflow 的几乎所有问题,但我得到的结果并不好,我的意思是生成的图像质量很差
在查看了一些服务/工具之后,我得出了一个结论。大多数 Text-to-Speech 工具的技术含量太高、太机械化——换句话说,就是质量差的 c 语音。 是的,最重要的是,看起来它们带有“硬编码”语音模
我一直用pgfplot的 latex生成数字(.pdf 格式)。现在,我想发表的期刊希望我的数字为 eps 格式。 我尝试使用 pdftops -eps fig.pdf fig.eps 将 pdf 转
我有一个问题,我一直无法弄清楚。我有一个应用程序可以从正面和背面相机拍摄一张照片,然后将它们合并在一起。 应用的名称是GroupCam 但是我有一个问题,我的 UIButtons 从一开始就不会作为
我有兴趣创建一个非常简单、高质量(加密)的随 secret 码生成器。有没有更好的方法来做到这一点? import os, random, string length = 13 chars = str
我正在尝试通过 Imagick 将 PDF 转换为高质量的 PNG,但文件总是模糊不清。目前,我正在运行以下选项,但找不到正确的标志来从转换中获得清晰的 PNG。原始 PDF 文件为 8.5 x 11
当我运行这个程序时,图像将转换为 pdf,但给定的输出 pdf 与图像不匹配,因为它被裁剪了。我使用 iText 库。 import java.io.FileOutputStream;
simple 之间有什么区别? , highQuality和 balanced textBreakStrategy 的值的属性(property)React Native 中的组件? document
高质量的图像还需要下载(从 Firebase)并显示,一旦我们滚动并且图像超出屏幕,然后 feed 恢复正常,也会使 feed 缓慢且滞后 https://pastebin.com/ibcaGzVH这
我使用 FabricJs 在 Canvas 上创建了一个带有一些图片和文本的设计 (270x470),然后我通过 fabricJS 的 canvas.toJSON() 方法以 JSON 格式导出所有图
我是一名优秀的程序员,十分优秀!