防御式编程

来源:互联网 发布:工作日志管理系统源码 编辑:程序博客网 时间:2024/05/16 06:31

1.保护程序免遭非法输入数据的破坏

     通过三种方法来处理进来垃圾的情况

1)检查所有来源于外部的数据值

2)检查子程序所有输入参数的值

3)决定如何处理错误的输入数据

2.Assertions 断言

    在实现中Assert是程序中的一条语句,它对一个boolean表达式进行判断,若这个值为true就说明程序正确,如果这个值为false就说明程序出现了问题,系统将给出警告或推出,一般来说assert用于保证程序最基本关键的正确性,assert检查通常在开发和测试时开启,为了提高性能,assert检查在发布后是关闭的。

    .NET SDK 包含两个调试器:CORDBG.EXE 和 DBGURT.EXE。其中,DBGURT.EXE 是较好的 GUI,CORDBG.EXE 是基于控制台的版本。

       讨论断言之前不得不说的一个是条件编译,因为离开了条件编译,断言将不复存在。C#中支持的条件编译有两种#ifdef ........#endif和自定义属性Conditional。

 

#ifdef  #endif的用法

#if DEBUG
        public static void DebugOnlyMethod2()
        {


            Console.WriteLine("DEBUG2 is active!!");

        }
#endif

 static void Main(string[] args)
        {

           #if DEBUG
            DebugOnlyMethod2();
            #endif

        }

 

条件属性的用法

        [Conditional("DEBUG")]
        public static void DebugOnlyMethod()
        {
            Console.WriteLine("DEBUG is active!!");
        }

       static void Main(string[] args)
        {
            DebugOnlyMethod();

        }

 

只有在编译时使用了Debug,DebugOnlyMethod方法才会被执行

 

条件编译中使用断言,跟踪和TraceSwitch

BCL 提供了两个完全相同的类来处理跟踪和断言:Trace 和 Debug,这两个类之间的观念是:当您定义 DEBUG 类时,Debug 类是活动的;而当您定义 TRACE 时,Trace 类是活动的。根据文档资料,Microsoft 希望您对调试版本使用 DEBUG,而对所有版本使用 TRACE。

if ( true == bShowTrace )
{
Debug.WriteLine ("Num = " + Num + " value out of range!" ) ;
}
if ( true == bShowTrace )
{
Trace.WriteLine ("Num = " + Num + " value out of range!" ) ;
}
创建和使用 TraceSwitch 的过程有一些琐碎。下面的代码片段说明了 TraceSwitch 的创建和使用。我使用 WriteLineIf 压缩了该代码片段。
public static void Main ( )
{
TraceSwitch TheSwitch = new TraceSwitch (
"SwitchyTheSwitch", "Example Switch" );
Trace.WriteLineIf ( TheSwitch.TraceError ,
"Error tracing is on!" ) ;
Trace.WriteLineIf ( TheSwitch.TraceWarning ,
"Warning tracing is on!" ) ;
Trace.WriteLineIf ( TheSwitch.TraceInfo ,
"Info tracing is on!" ) ;
Trace.WriteLineIf ( TheSwitch.TraceVerbose ,
"VerboseSwitching is on!" ) ;
}