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

  • 相关阅读:
    NYOJ 260
    NYOJ 271
    [转载]《博客园精华集》Winform筛选结果(共105篇)
    在DataGridView控件中加入ComboBox下拉列表框的实现
    给SQL补充一个查看表结构的存储过程
    编写自定义控件之下拉式属性
    PropertyGrid中的枚举显示为中文(转)
    DataGridView 中合并单元格
    树TreeView控件与DataTable交互添加节点(最高效的方法)
    通过键盘方向键控制TreeView节点的移动
  • 原文地址:https://www.cnblogs.com/MuNet/p/6687885.html
Copyright © 2020-2023  润新知