系列文章:第一次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:
{
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 :
// 使用buffer
Marshal.FreeHGlobal(buffer);
Do:
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:
if ( " .aa:.bb:.cc " .Contains(fileInfo.Extension.ToLower()))
{
return true;
}
else
{
return false;
}