惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

aimingoo的专栏
aimingoo的专栏
I
InfoQ
B
Blog RSS Feed
D
Docker
GbyAI
GbyAI
N
Netflix TechBlog - Medium
Y
Y Combinator Blog
F
Fortinet All Blogs
P
Proofpoint News Feed
Microsoft Azure Blog
Microsoft Azure Blog
人人都是产品经理
人人都是产品经理
Martin Fowler
Martin Fowler
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
M
MIT News - Artificial intelligence
C
Check Point Blog
Vercel News
Vercel News
云风的 BLOG
云风的 BLOG
博客园 - Franky
Google DeepMind News
Google DeepMind News
WordPress大学
WordPress大学
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
V
V2EX
Last Week in AI
Last Week in AI
L
LangChain Blog

博客园 - 天天爱晴天

招Android软件测试人员 从.net星移居到android星 恐怖故事和童话故事-可靠代码实践1 测试好书推荐,从理念到实践 测试好BLOG推荐-微软测试大将的BLOG 不知庐山真面目,看微软测试圣经How we test software at ms Powershell大印象系列3: 解惑,真相?补充一下 Powershell大印象系列2:丰富的帮助,丰富的资源 Powershell大印象系列1:惊艳呀 Book review..看了一下午的.NET Framework.归纳了几点 微软2008年的CEO SUMMIT的视频(大家可以领会一下未来的趋势呀) 我犯了的错误 by 第一次 CodeReview(Updated 毕业啦,去深圳文思创新工作,找房子租ING 被抛弃的感觉 游走回忆 回顾2006年的N个没有实现的构思(上) 苦思论文题目,灵感触发VISIO 2007 开始写论文啦(各位给点意见) 汇丰笔筋(未知版)
第二次CODE REVIEW (d)
天天爱晴天 · 2008-05-28 · via 博客园 - 天天爱晴天

系列文章:第一次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;
            }