阅读 桌面完整版
在做代码审核的时候,发现有一同事写了这样的代码.出现这种代码只能说明工作压力山大, 都不思考了.
不需要注释也能看明白,意思就是想获取一个唯一的临时文件,用了 Path.GetRandomFileName() 得到一个随机文件名,并且用 Path.GetTempPath() 得到临时文件夹.问题是他觉得这样不保险,于是就不停的尝试,如果文件存在的话,就试着下一个随机的文件名,直到不重复(或者最大尝试 100 次), 看到这里, 真是醉了.
另一个小问题就是,这个 while 还每次判断 文件名是否为空,这个只有在第一次判断的时候才为空,之后都不可能为空的,这样的代码质量真的很低.
C# (.NET) 里 Path.GetTempFileName() 创建一个临时文件,并返回这个文件名.创建文件名的好处是这样就能确定该文件是唯一的, 因为其它进程在执行这个函数的时候如果文件名存在,则会获取下一个临时文件名并创建.每次都能保证唯一,而不会出现多个进程获取得到同样的文件名.
该程序员想的是,获取一个文件名(并不着急创建),之后再创建,感觉就是脱裤子放屁,多此一举,因为获取临时文件名就是肯定要创建该文件的,不创建的话获取文件名干什么?
代码审核很重要,因为这段代码平常来说是不会出问题的,但是效率实在不敢恭唯.
实际上,上面的代码完全可以替换成下面的代码(不会创建文件名), 这样的结合会更加实用些 (而且更简便, 高效)
1 2 3 4 | public static string GetTempFileName() { return Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); } |
public static string GetTempFileName() { return Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); }
英文同步: https://helloacm.com/code-review-gettempfilename-in-c/
强烈推荐
- 英国代购-畅购英伦
- TopCashBack 返现 (英国购物必备, 积少成多, 我2年来一共得了3000多英镑)
- Quidco 返现 (也是很不错的英国返现网站, 返现率高)
- 注册就送10美元, 免费使用2个月的 DigitalOcean 云主机(性价比超高, 每月只需5美元)
- 注册就送10美元, 免费使用4个月的 Vultr 云主机(性价比超高, 每月只需2.5美元)
- 注册就送10美元, 免费使用2个月的 阿里 云主机(性价比超高, 每月只需4.5美元)
- 注册就送20美元, 免费使用4个月的 Linode 云主机(性价比超高, 每月只需5美元) (折扣码: PodCastInit2022)
- PlusNet 英国光纤(超快, 超划算! 用户名 doctorlai)
- 刷了美国运通信用卡一年得到的积分 换了 485英镑
- 注册就送50英镑 – 英国最便宜最划算的电气提供商
- 能把比特币莱特币变现的银行卡! 不需要手续费就可以把虚拟货币法币兑换
微信公众号: 小赖子的英国生活和资讯 JustYYUK
| 另一个小问题就是,这个 while 还每次判断 文件名是否为空,这个只有在第一次判断的时候才为空,之后都不可能为空的,这样的代码质量真的很低.
实际上这是正确的, 判断为空的代码只会执行2次.
1: 第一次进入
2: 文件不存在, 判断为空false, 退出while.
中间情况(即如果文件存在的情况), 因为会短路, 所以判断为空的代码是不会执行的.
嗯嗯, 是的. 判断为两次.
可以一次都不需要判断的.
> 100 真心醉了.
但不创建文件也是很常见的, 也许我只想直接以pipe的方式写入文件. 不过这段代码确实挺有问题的, 先不说100次失败之后就完蛋了的情况. 就算得到唯一文件名了, 那又是怎么保证在使用的时候, 这个路径下的文件没有被其他程序创建呢.(更新的代码同样有这个问题) 所以这么不靠谱, 不如在Temp里面搞个专用文件夹, 如何?
哈哈, 是啊..所以最好是用系统自带的 GetTempFileName 这样系统在创建文件后就能保证唯一(其它进程无法再创建了)
不明觉厉!你的同事看到这篇文章不会不开心吧,哈哈.
呵呵, 没事的,国内的同事.
程序猿的世界,真难懂.我等外行从来就是能转就行,管他什么效率不效率.
你会R语言,也是标准的程序猿一枚.