今天看到一个文章,主要讲述几个C#程序员在写代码时容易犯的毛病,内容很简单,没啥技术含量,都是一些稍微注意下即可避免的问题。我把它翻译过来只是方便大家加深一下记忆(某些代码不好格式化,所以我以截图的形式显示,需要看实际代码的可以在原文地址中找到,标题不能出现#这个符号,得硬生生将C#改为.net,无语中)。

原文:7 Common Mistakes Made By C# Programmers

地址:http://www.codeguru.com/csharp/article.php/c17911/7-Common-Mistakes-Made-By-C-Programmers.htm#page-1

作者:V.N.S Arun

介绍

在编程中犯错是不可避免的。即使一个简单的错误也会产生昂贵的代价。所以最明智的做法是从中汲取经验,不再犯同样的错误。我会在这篇文章中强调一下我认为C#程序员在开发过程中最容易犯的7个通病。

格式化字符串

在C#编程中处理字符串类型时,很有可能犯那些代价高的错误。在.net框架中,字符串一直都是不可变类型。当一个字符串被修改时,它总是会创建一个全新的副本而不是修改原有的字符串。但大部分开发者都会像下面这个例子一样来格式化字符串:

上面的代码看起来确实非常的乱。再者,因为字符串是不可变类型,这种多次拼接操作会在内存中创建3个多余的垃圾字符串副本。

更好的做法是使用string.Format,因为它内部使用了可变类型的StringBuilder。同时,这样做也为编写整洁的代码打下基础。

嵌套异常处理

下面的代码展示了开发者打算编写的嵌套方法,其中每个方法都做了异常处理:

如果像上面的代码那样,相同的异常被多次处理或更有甚者,捕获异常后再重新抛出明显会增加性能开销。

我通过把异常的处理都统一放到MainMethod中的某个位置来避免上述情况,如下所示:

在大型集合中使用foreach

大部分开发者会使用foreach循环来替代for,因为foreach更易于使用。

然而在处理有大量数据的集合时,这会导致昂贵的开销。思考一下以下的这个例子,我分别使用了for和foreach来循环相同的datatable,同时也请检查一下图1.0中两个循环分别使用的时间

正如你看到的一样,forech循环是慢的,它需要花费大概两倍于for循环的时间。这是因为在foreach中,dt.Rows会访问datatable中所有的行。

当需要在更大的集合中进行循环时,总是用for就行了。

验证基本数据类型

大部分开发者并不知道用来验证像System.Int32这些基本数据类型的内建方法,最后往往会自定义一个实现。下面的函数就是一个通过自定义逻辑来验证给定的字符串是否数字的例子

由于该方法包含了try catch,所以它并不是最好的实现方式。更好的方法是使用下面所示的int.TryParse

在我看来使用 int.TryParse明显运行更快,代码更清晰。

处理实现IDisposable接口的对象

在.net框架中,释放一个对象和使用它一样重要。最理想的方式是在一个类中实现IDisposable接口中的Dispose()方法,这样我们在using完那个类的对象后,它就会因为dispose方法被调用从而被释放。

下面所示的是一个SqlConnection对象从创建、使用到被释放的例子:

在上面的方法中,connection的dispose是在finally块中被调用的,这样做是因为一旦发生异常,catch块就会被执行,之后finally块也会被执行来释放connection。所以,connection会一直驻留在内存中直到finally块被执行。在.net框架中,当资源不再使用时及时释放是基本的准则之一。

下面的代码展示了一种更好的调用dispose方法的方式:

当你像上述那样使用using块时,一旦代码执行退出了using块,对象的dispose方法会被马上调用。这样能够确保sqlconnection资源能够被最快释放。你应该也察觉这种使用方式对于到任何实现Disposable接口的类都凑效。

声明公有变量

听上去简单,但它的确会导致你误用已声明的公有变量和给你的类型带来没有预料到的使用方式。

思考一下以下的这个例子:

在上述例子中,MyAcoount类型有一个公共有型变量AccountNumber并在构造函数中被赋值。我们希望AccountNumber是只读、不可修改的,但是MyAccount类型没法去控制这种行为。

更好的方式是将类似于AccountNumber的公有变量改为属性,如下面所示:

在这里,MyAccount已经对AccountNumber属性有了很好地控制。现在它变为只读的,调用者无法再设置它的值了。

访问System.Data.DataTable中的值

我经常发现大部分程序员通过列索引来访问datatable中的数据,正如下面所示的那样:

在上面的情况中,如果sql数据查询中的列顺序更改了,那么你的应用程序肯定会崩溃掉。我们应该总是通过列名来查找相应的数据,正如下面所示的那样:

即使列的顺序改变了,上面的代码也不会崩溃掉。同时,我们通过使用常量在某个位置统一记录所有的列名,即使你以后列名变了,你只要修改代码中的一处地方即可。

【转】译文:.net 程序员易犯的7个通病相关推荐

  1. 机器学习入门阶段程序员易犯的5个错误

    本文由 伯乐在线 - toolate 翻译自 machine learning mastery.欢迎加入 技术翻译小组.转载请参见文章末尾处的要求. 怎样进入机器学习领域没有定式.我们的学习方式都有些 ...

  2. 初级程序员经常犯的10种错误,网友:工作几年了都还在犯

    初级程序员经常犯的10种错误,网友:工作几年了都还在犯 小编在网上经常容易看见#程序员如何升职#.#程序员的进阶之路#这样的话题,于是我整理了一些网上的资料并结合自己的经验,梳理出了10种初级程序员经 ...

  3. Python程序员常犯的十个错误

    不管是在学习还是工作过程中,人都会犯错.虽然Python的语法简单.灵活,但也一样存在一些不小的坑,一不小心,不管是初学者还是资深Python程序员都有可能会栽跟头. 常见错误1:错误地将表达式作为函 ...

  4. 后端技术:Java 程序员常犯的 10 个 SQL 错误!

    Java程序员编程时需要混合面向对象思维和一般命令式编程的方法,能否完美的将两者结合起来完全得依靠编程人员的水准: 技能(任何人都能容易学会命令式编程) 模式(有些人用"模式-模式" ...

  5. Java 程序员常犯的 10 个 SQL 错误!

    往期热门文章: 1.摸鱼王!2.抖音服务器带宽有多大,才能供上亿人同时刷?3.Spring新版本抛弃JVM,可独立部署,网友:要自立门户???4.记一次因 Redis 使用不当导致应用卡死 bug 的 ...

  6. 当上 CTO 才发现:程序员时常犯的 4 个错误有多可怕!

    ‍‍ [CSDN 编者按]随着网络科技的创新,IT行业迎来了长足的发展,程序员群体也在不断扩大当中.尽管程序员能够解决开发或测试或运维等各自方向的大部分问题,但程序员毕竟不是万能的,也会出现常见的错误 ...

  7. 初级程序员常犯错误一览

    作者 | 饶全成 来源 | 码农桃花源(ID:CoderPark) 最近接手其他人做的项目,导致之前的一些幻想破灭了.因为刚工作的时候做项目是php,而php本身的web框架一般只简单区分mvc,稍微 ...

  8. 程序员常犯的五个非技术性错误

    一个好的程序员需要培养两种技能:技术技能和非技术技能.然而有些开发者只注重技术的部分,而忽视了其他部分. 下面是程序员最常犯的 5 个非技术性错误: 缺乏自律 Jim Rohn 曾经说过:自律是目标和 ...

  9. 程序员常犯的5个非技术性错误

    一个好的软件开发人员需要培养两种技能:技术技能和非技术技能.不幸的是一些开发者只注重技术的部分,以致养成一些陋习,下面是最常犯的5个非技术性错误: 0. 缺乏自律 Jim Rohn曾经说过:自律是目标 ...

最新文章

  1. 【ZooKeeper Notes 15】Watcher使用的注意事项
  2. FE.ES-终结0.1+0.2,答到点上的那种
  3. 在ISA Server 2004中发布×××服务器
  4. 《直播疑难杂症排查》之四:延时高
  5. CAN总线抗干扰的六种解决方案
  6. NOI题库 python题解-2022.01.07整理(1.4-1.7)
  7. C++ 操作符new和delete
  8. Luogu 3625 [APIO2009]采油区域
  9. 掌握这个分析方法,数据分析就学会了一半
  10. php 写入.csv文件注意点
  11. WordPress模板iDowns1.8.3+支持对接Erphpdown
  12. CC2530单片机精确延时的时间分析
  13. 信息差怎么赚钱?这个小众项目完全0门槛
  14. 将QT中的单选、复选框从选中状态设置为未选中状态
  15. oracle 日期格式筛选,oracle 日期格式怎么筛选
  16. Jetpack-MVVM-高频提问和解答,附带学习经验
  17. 【火炉炼AI】机器学习053-数据降维绝招-PCA和核PCA
  18. android老人字体变大,适合老年人用的安卓手机软件 一键让Android字体变大
  19. 爱普生L4158使用评测及小白智慧打印离线解决办法
  20. HTML5七夕情人节表白网页(烂漫的空中散落的花瓣3D相册) HTML+CSS+JS 求婚 html生日快乐祝福代码网页 520情人节告白代码 程序员表白源码 3D旋转相册 js烟花代码

热门文章

  1. CMOS图像传感器——TDI CIS
  2. 深度学习之pytorch(二) 数据并行
  3. 可以进行单元测试么_前端与单元测试
  4. 由Google Protocol Buffer的小例子引起的g++编译问题
  5. 淘淘商城项目mysql服务器_SpringMVC+Spring+Mybatis+Mysql+Maven+Svn[ 淘淘商城项目环境搭建 ]...
  6. 第5章 Python 数字图像处理(DIP) - 图像复原与重建8 - 估计噪声参数
  7. java中udi_Java读取.properties配置文件的方法
  8. 网站主机和服务器选哪个,虚拟主机和服务器 你的网站该选择哪一个?
  9. ALGO-162——Airport Configuration
  10. docker与jenkins学习