在和C#新手一起工作的时候,我注意到他们经常重复一些错误。这些错误,当你指出来的时候很容易理解。然而,如果一个开发者没有意识到这些错误,将会影响正在开发的软件的质量和效率,因此,我决定总结8个常见的错误。
 

1. 使用字符串连接代替StringBuilder

在你向一个字符串追加新字符串的时候,字符串连接方法是可行的。但是这样会导致新的内存空间被创建。被追加的字符串会拷贝到新的内存单元。这样的效率很低。而我们使用StringBuilder的话,可以免去字符串拷贝的发生。感谢StringBuilder在连接字符串中带来的高效率,尤其是在多次追加的操作中。

//错误写法
List values = new List(){"This ","is ","Sparta ","!"};
string outputValue = string.Empty;
foreach (var value in values)
{
outputValue += value;
}
//正确写法
StringBuilder outputValueBuilder = new StringBuilder();
foreach (var value in values)
{
outputValueBuilder.Append(value);
}
 

2. LINQ - 'Where' 条件中使用 'First', 代替使用 FirstOrDefault

很多程序员在做查找操作的时候喜欢用'Where'操作并通过'First'获取第一次出现的记录。这样的操作是不对的。因为'First'操作不会在'Where'条件中起到作用。而且,这样也不能确保记录一定被找到。如果'First'在没有记录返回的操作中使用,系统会返回默认值并且没有任何异常被抛出。

//错误的写法
List numbers = new List(){1,4,5,9,11,15,20,21,25,34,55};
return numbers.Where(x => Fibonacci.IsInFibonacciSequence(x)).First();
//部分正确的写法
return numbers.First(x => Fibonacci.IsInFibonacciSequence(x));
//正确的写法
return numbers.FirstOrDefault(x => Fibonacci.IsInFibonacciSequence(x)); 
 

3. 当对象不可转换的场合中,通过'(T)'操作做类型转化代替使用 'as (T)' 。

对于软件开发人员来说,使用'(T)' 做类型转换,而不是使用 'as (T)' 是很常见的写法。实际上,这样通常不会带来危害,因为多数对象都是可转换的。但是,如果在很低的可能性还是发生的情况下,对象不能转换,那么使用 'as (T)' 才是正确的。 详细请查看 Prefix-casting versus as-casting in C#

//错误
var woman = (Woman)person;
//正确
var woman = person as Woman;
 

4.不使用映射重写属性

有许多强大的C#映射(例如 AutoMapper)。如果只有几行代码来重写属性,这绝对可以用映射来代替。即使一些属性不能直接复制,但总有一些其他的逻辑可以让映射成为一个很好的选择(映射能够在更大泛围内定义重写属性的规则)。

 

5.错误地重新抛出异常

C#程序员使用“throw ex”来抛出一个异常经常会忘记对栈的跟踪,会使程序难以调试并且不能形成日志信息,如果简单地使用“throw”,那么数据将不会丢失,并且可以方便地检索整个异常的堆栈跟踪。

//错误
try
{
//some code that can throw exception [...]
}
catch (Exception ex)
{
//some exception logic [...]
throw ex;
}
//正确
try
{
//some code that can throw exception [...]
}
catch (Exception ex)
{
//some exception logic [...]
throw;
}
 

6. 没有使用 ‘using’ 语句来销毁对象

很多C#的软件开发人员竟然不知道关键字 'using' 不单单只用于引入命名空间,而还有回收销毁对象的功能。如果你明确知道某个对象在进行完某些操作后,不再有用,需要回收,你可以使用'using' 语句来销毁对象。

//以下语句:
using(SomeDisposableClass someDisposableObject = new SomeDisposableClass())
{
someDisposableObject.DoTheJob();
}
//和以下语句是一样效果:
SomeDisposableClass someDisposableObject = new SomeDisposableClass();
try
{
someDisposableObject.DoTheJob();
}
finally
{
someDisposableObject.Dispose();
}
 

7. 除了对象集合外,使用'foreach' 代替 'for'

请牢记除了对象集合之外(例如数组),当你需要进行迭代操作的时候,使用'for' 会比使用 'foreach'效率更高。请参考Foreach vs For Performance 。

 

8. 对数据库进行读取或保存操作的时候,使用多次的DB调用

这是非常常见的错误,尤其在初级开发人员当中。特别是在使用ORM框架的时候,例如Entity Framework和NHibernate。每次的DB的调用都会耗费资源,所以对DB的操作越少越好。你可以通过以下方式做到:

  • 使用fetching(贪婪加载)
  • 把DB操作封装在事务当中
  • 为了避免复杂的逻辑,可以把业务逻辑封装到存储过程中。

可以说,还有C#程序员经常会遇到的错误还有很多很多。如果你发现某项是你感兴趣的或者你需要分享你的看法,欢迎留下你宝贵的意见。

C# 开发者最经常犯的 8 个错误的更多相关文章

  1. Python开发者最常犯的10个错误

    Python是一门简单易学的编程语言,语法简洁而清晰,并且拥有丰富和强大的类库.与其它大多数程序设计语言使用大括号不一样 ,它使用缩进来定义语句块. 在平时的工作中,Python开发者很容易犯一些小错 ...

  2. 总结Java开发者经常会犯的前十种错误

    [导读] 在Java中,有些事物如果不了解的话,很容易就会用错,如数组转换为数组列表.元素删除.Hashtable和HashMap.ArrayList和LinkedList.Super和Sub构造函数 ...

  3. [转载]AngularJS 开发者最常犯的 10 个错误

    http://www.oschina.net/translate/top-10-mistakes-angularjs-developers-make

  4. 10个最容易犯的Python开发错误

    10个最容易犯的Python开发错误 转载 2017年09月25日 16:54:36 标签: python / 大数据 / 大讲台   Python是一门简单易学的编程语言,语法简洁而清晰,并且拥有丰 ...

  5. 【转载学习前辈的经验】-- Mistakes I made (as a developer) 我(作为一名开发者)所犯过的错误

    我 2006 年开始工作,至今已经 10 年.10 年是个里程碑,我开始回顾自己曾经犯过的错误,以及我希望从同行那里得到什么类型的忠告.一切都在快速改变,10 年了,我不能确定这些秘诀是否还有用. 不 ...

  6. [转载]有经验的Java开发者和架构师容易犯的10个错误

    首先允许我们问一个严肃的问题?为什么Java初学者能够方便的从网上找到相对应的开发建议呢?每当我去网上搜索想要的建议的时候,我总是能发现一大堆是关于基本入门的教程.书籍以及资源.同样也发现网上到处充斥 ...

  7. Java开发者写SQL时常犯的10个错误

        首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 我要投稿 更多频道 » - 导航条 - 首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 我要投稿 更多频道 » - iOS ...

  8. C# 程序员最常犯的 10 个错误

    关于C# C#是达成微软公共语言运行库(CLR)的少数语言中的一种.达成CLR的语言可以受益于其带来的特性,如跨语言集成.异常处理.安全性增强.部件组合的简易模型以及调试和分析服务.作为现代的CLR语 ...

  9. Java程序员常犯的10个错误

      本文总结了Java程序员常犯的10个错误. #1. 把Array转化成ArrayList 把Array转化成ArrayList,程序员经常用以下方法: List<String> lis ...

随机推荐

  1. hadoop 1.x 集群环境的搭建

    本文主要以个人工作学习总结为主,同时也为了方便更多的兴趣爱好者参与学习交流,现将具体的搭建步骤分享如下: 一.基础环境 1.1 jdk的安装与配置 Hadoop是用Java开发的,Hadoop的编译及 ...

  2. 实现一个带有指纹加密功能的笔记本(Android)第二部分

    上文基本完成了整个笔记本的笔记功能的实现,接下来记录实现指纹识别加密以及一些小注意事项. 首先判断该手机是否具备指纹识别的硬件功能和用户是否开启指纹识别. public boolean isFinge ...

  3. EnterpriseDB公司的 Postgres Solution Pack (一)

    下载地址: http://www.enterprisedb.com/products-services-training/products/postgres-plus-solution-pack/do ...

  4. [Jmeter]jmeter之BeanShell Sampler测试应用

    前言: 在做接口测试的时候,有些接口做了签名校验,而签名是根据某算法进行加密,这时候,简单的接口测试工具无法完成该工作,所以想到了Jmeter,他是java编写,有强大的扩展性,足矣完成我们需要的操作 ...

  5. WSL跑linux服务程序

    前段时间折腾了一次WSL下的Apache,无奈遇到各种奇葩问题,总是解决不了,最终放弃,甚至得出了一个现在看来比较可笑的结论:WSL是不可能跑Linux服务程序的! 当时的思路想歪了,由于Apache ...

  6. lunix安装

    https://www.cnblogs.com/wcwen1990/p/7630545.html

  7. VS Help Viewer 显示内容为HTML源码的问题

    万恶的IE10 为了学习,安装了一套Windows Server 2012+SQL 2012+VS 2012的环境,整体感觉还不错,只是在使用Help Viewer查看帮助的时候,发现显示内容居然为H ...

  8. 「日常训练」Woodcutters(Codeforces Round 303 Div.2 C)

    这题惨遭被卡..卡了一个小时,太真实了. 题意与分析 (Codeforces 545C) 题意:给定\(n\)棵树,在\(x\)位置,高为\(h\),然后可以左倒右倒,然后倒下去会占据\([x-h,x ...

  9. python3 小实践(一)——selenium获取的cookie传递

    from selenium import webdriver from time import sleep import requests import pickle #获取登录后的cookies c ...

  10. 【sessionInfo】使用说明

    对象:sessionInfo 说明:会话类型操作,此对象是session与cookies的完善版,解决了session异常丢失及cookies文件大小的问题. 注意: 1)  访客的IP地址发生变化时 ...