首页 ┆ 网站地图 ┆ 在线留言 ┆ 游戏资讯 ┆ 资源下载 ┆ 端午节祝福 ┆ 迅雷在线影视 ┆淘宝手机在线充值 ┆淘宝游戏点卡充值 
设为首页
加入收藏
联系我们
高级搜索
您当前的位置: 主页>NET专区>C#语言>关于C#程序中Bug的快速修复方法
关于C#程序中Bug的快速修复方法
来源: 发布时间:2007-09-28 发布人: 浏览: 人次   字体: [ ]  
本文将为大家介绍一下如何对C#程序Bug修复的快速方法。.NET Framework中包含许多工具可以用来更快、更容易地编写正确的程序。但我们得面临这样的情况:出现bugs。不管程序多么简单,程序员都可能出错。

  根据我的经验,大多数程序的bugs出现在程序员之间的接口:当一个程序员编写的代码被另一个程序员调用时。不知何故,调用者破坏了代码编写时做的假设。是谁的过错呢?这并不要紧,更重要的是你能多快修好它?下面这些技巧将帮你在程序投入使用前更快地发现并解决这些问题。最终,这些技巧会帮你诊断任何的确在使用中出现的问题。

  测试假设条件

  测试假设条件是构建正确的程序最重要的一个方法。在你写一个函数时,你应该考虑并确定你对那个函数做了什么样的假设。你应该问自己以下这些问题:

  1. 当这个函数被调用时,这个对象必须是怎样的(对象初试化,某个内在变量值)?

  2. 当这个函数存在时,这个对象将会怎样(仍是#1,但包括该函数的副作用)?

  3. 该函数的任何参数必须是怎样的(允许空值吗,输入值的范围是什么)?

  4. 返回值必须是怎样的?

  一旦你问了自己这四个问题并作出回答后,把答案放到代码中。

  在C#中,用System.Diagnostics.Debug类的Assent方法来表示:

以下是引用片段:
public bool ProcessIterations (int numIters)
  {
  Debug.Assert (numIters > 0,
  "ProcessIterations.",
  "Iterations must be more than 0");
  // More code...

  该代码片段执行了numiters参数必须大于零这样一个假设。如果你用一个无效的参数调用processiterations,该assert被触发。这时候,程序停止运行并通知用户出现的错误。声明(assertions)只被编译到debug 版本中的程序,所以它们不影响生产情况中的性能。

  为什么用这种方法? 运用这种技巧可以确保很快地发现对你的类的方法未预料地使用。然后,或者调用者修改他的代码,或者要求在你的类的行为(behavior)中修改。

  验证完整性

  一个C# 程序中的大多数函数都是一个对象上的实例方法。对任何对象的有效状态都有暗示的假设。当一个公有的方法被调用时,你应该确保那些暗示的假设经过了测试。C# 的条件编译特征使这一点很容易实现。

  首先,写一个私用的函数来测试对象的完整性。你在这么做时,将该方法标为“conditional”: [Conditional ("DEBUG")]

以下是引用片段:
  private void ImOK ()
  {
  Debug.Assert (this != null,
  "Testing Object State",
  "this cannot be null");
  // More here.
  }

  然后,在每个公有的方法中,调用ImOK方法:

以下是引用片段:
public bool ProcessIterations (int numIters)
  {
  ImOK ();
  Debug.Assert (numIters > 0,
  "ProcessIterations.",
  "Iterations must be more than 0");}

  在发布(Release)版本中,编译器自动取消对ImOK 的调用。

  为什么用这种方法?运用该技巧,你可以快速发现任何你的对象状态变得无效的情况。

  运用debug 和Trace 输出

  打印诊断消息可以帮你确定你的程序是怎么出错的。你需要知道当触发一个Assert时,发生了什么情况;你也通常需要知道在这之前发生了什么。知道这些的最好的方式就是运用你的代码,这样你就可以很容易地看到在出现bug前,调用了什么函数。

  在生成调试输出时,.net Framework有一些新的功能可以用。System.Diagnostic.Debug类可以让你格式化调试输出,并能很容易地创建不同的类或级别的调试输出。下面是我喜欢用的一些指导方针。

  首先,在你的程序中为每个类建一个traceswitch对象:

以下是引用片段:
public class MyClass
  {
  private static TraceSwitch
  myClassSwitch = new TraceSwitch
  ("MyClassSwitch", "Controls the \
  debug output of MyClass");}

  然后,用WriteIf() 和 WriteLineIf() 方法来记录任何你觉得有助于你跟踪你的程序的信息:


共2页: 上一页 1 [2] 下一页
相 关 文 章   发布商链接
·代码分析如何构造一个C#语言的爬虫程...
·c#中收发邮件处理代码(POP3,IMAP,...
·C#中正则表达式进行忽略大小写的字符...
·如何在C#中播放AVI短片并使背景透明...
·如何用C#读取Windows注册表中的多重...
·asp.net打造进度条窗口代码,还有取消...
·C#实现日期转换为大写代码
·C#装箱与拆箱的代码事例小解
·C#获取硬件标志代码示例
·快速进行List排序的通用方法代码
 §最新评论:(评论内容只代表网友观点,与本站立场无关!)
网名: 验证码:  【所有评论】【↑返回顶部
评 分: 12 345
评论内容:(不能超过500字,请自觉遵守互联网相关政策法规。[按 Ctrl+Enter 可直接提交]
注意:请勿在本站发布政治话题、色情及违反法律的内容。
IT知道网 声明:刊登此文章是为了传递更多信息,文章内容仅供参考,转载请注明出处。
推 荐 文 章
·最为经典的C#操作文件的方法...
·有助快速理解C#委托和事件之...
·C#泛型学习笔记总结
·c#语言从dbf数据库提取数据并
·C#编写控制线程的运行和线程...
·怎样在C#中删除只读文件及其...
·C#函数中返回多个值的两种方...
·如何在C#中插入照片到Excel文
·如何在c#中获取事件注册的方...
·C#对timer类的使用操作代码
·什么是泛型?泛型的一些概述
·C#如何从文本文件读取信息并...
·如何在c#中去掉字符串中的回...
·如何使用C#获取IIS服务器版本...
·什么是泛型编程思想?及其简...
热 门 文 章
·C#如何获取文件路径中的文件...
·c#中收发邮件处理代码(POP3,...
·浅谈接口和抽象类的区别,加...
·什么是c#深拷贝与浅拷贝及其...
·C#语言实现创建、删除和移动...
·C#中关于四舍五入函数的讨论...
·c#中的ArrayList属性祥解及其...
·快速进行List排序的通用方法...
·C#对timer类的使用操作代码
·C#如何从文本文件读取信息并...
·C#语言实现从XML文件导出数据...
·用C#编写ActiveX控件代码实例
·如何在c#中去掉字符串中的回...
·String.Split 方法使用及其代...
·C#语言绘制实时曲线图代码实...
网站首页 - 关于本站 - 加入收藏 - 网站地图 - 友情连接 - 在线留言 - 联系我们 - 返回顶部
Copyright © 2007 IT知道网.[冀ICP备07026896号]. All Rights Reserved .