zoukankan      html  css  js  c++  java
  • C# 开发者最经常犯的 8 个错误

    在和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#程序员经常会遇到的错误还有很多很多。如果你发现某项是你感兴趣的或者你需要分享你的看法,欢迎留下你宝贵的意见。

  • 相关阅读:
    Construct Binary Tree from Preorder and Inorder Traversal
    Construct Binary Tree from Inorder and Postorder Traversal
    Maximum Depth of Binary Tree
    Sharepoint 2013 创建TimeJob 自动发送邮件
    IE8 不能够在Sharepoint平台上在线打开Office文档解决方案
    TFS安装与管理
    局域网通过IP查看对方计算机名,通过计算机名查看对方IP以及查看在线所有电脑IP
    JS 隐藏Sharepoint中List Item View页面的某一个字段
    SharePoint Calculated Column Formulas & Functions
    JS 两个一组数组转二维数组
  • 原文地址:https://www.cnblogs.com/MuNet/p/6687885.html
Copyright © 2011-2022 走看看