第二次CODE REVIEW (d)

系列文章:第一次CODE REVIEW 
              http://www.cnblogs.com/ttaqt/archive/2008/05/18/1202010.html

第二次code view ....被人冤枉没有研究“为什么”......没有研究为什么就不会有这系列的文章啦,可惜他不知道,哈哈。大家继续跟我一起讨论讨论吧。记得上次讨论了一下string比较的问题,我觉得如果能用Equals 就用咯,毕竟它是最最安全的值比较的方式,反正也没有什么损失。好,我们继续总结一下。。。。 :)

1. 对于函数,参数要尽量进行校验。NULL和EMPTY的校验是最最基本的。
   Don`t:
   public void MyFunction(string abc)
   {
          //直接使用或者在使用时校验
   }
   Do:
   public void MyFunction(string abc)
   {
          if(string.IsEmptyOrNull(abc))
           {
                  throw new Exception("abc is null or empty");
            }
           //其他校验,throw new Exception(....);
           //使用abc
    }
    Reason:
    可以确保函数稳定性。不知道是不是习惯了的原因。都为都是我自己调用自己的函数,模块的交互也是我写的。所以也没有注意这些。不知道你们也是不是呢?快去CHECK 一下自己的函数吧。

2. Try Catch 只包住需要捕捉异常
Don`t:

                try
                
{            

            logSavePath = Path.GetTempPath() + LogSaveFolder;

            if (!Directory.Exists(logSavePath))
            
{

    

                    Directory.CreateDirectory(logSavePath);
            }

                }

              
catch(ex)
{
    
//写日志
}


   Do:

          
            logSavePath = Path.GetTempPath() + LogSaveFolder;
            if (!Directory.Exists(logSavePath))
            
{
                
try
                
{
                

                    Directory.CreateDirectory(logSavePath);
                }

                
catch (Exception ex)
                
{
                    
throw new Exception(ex.Message + "Log_SaveAddress:" + logSavePath);
                }

            }

    Reason:
    说是TRY CATCH 有损耗的,不要乱用

3. 只针对”==”才用const左边的原则
Do:    if(3>=a)

    Don`t:    if(a<=3)

    Reason:   是行业准则

4. 过于非托管代码,使用时候要注意内存的释放。不要以为.NET就不用管理内存哦 :)
Don`t :   

IntPtr buffer = Marshal.AllocHGlobal(piCount * Marshal.SizeOf(typeof(CONADefinitions.CONAPI_DEVICE)));
// 使用buffer
Marshal.FreeHGlobal(buffer);

     Do:

IntPtr buffer = IntPtr.Zero;

try
{
    buffer 
= Marshal.AllocHGlobal(piCount * Marshal.SizeOf(typeof(CONADefinitions.CONAPI_DEVICE)));
    
//使用buffer
}

catch(ex)
{
   ..
}

finally
{
   Marshal.FreeHGlobal(buffer);
}

    Reason:
原因也不多说了。无论是数据库,IO读写文件,还有MARSHAL这个申请非托管内存的东东,都是这种写法啦。不过,正如C# effective所说,用USING也可以。不过基于它实现了IDisposiable 的基础上。而这个MARSHAL没有实现,如果你想的话,可以封装一下这个类,帮她实现dispose 的方法,里面填的就是finally里面的东东咯。

5. 例如string 没有被初始化,后面的程序是不能使用的。所以用NULL来初始化它,逃过编译器的变态检测。
Don`t:
String abc = string.Empty;
//使用abc

Do:
String abc = Null;
//使用abc

      Reason:
因为string.Empty占内存咯。

6. 使用表驱动法(关于具体的介绍,代码大全2和http://www.cnblogs.com/shinn/archive/2008/04/16/1157141.html 都有。
Don`t:
if(fileInfo.Extension.ToLower() == ".aa"||fileInfo.Extension.ToLower()==".bb"||.......)
{
        retrun true
}
Do:

            FileInfo fileInfo = new FileInfo(fileName);
            
if (".aa:.bb:.cc".Contains(fileInfo.Extension.ToLower()))
            
{
                
return true;
            }

            
else
            
{
                
return false;
            }
posted @ 2008-05-28 11:25  天天爱晴天  阅读(461)  评论(0)    收藏  举报